约瑟夫问题升级问题

编号为1~N的N个人按顺时针方向围坐一圈,每个人持有一个密码(正整数,可以自由输入),开始人选一个正整数作为报数上限值M,从第一个人按顺时针方向自1开始顺序报数,报道M是停止报数。报M的人出列,将他的密码作为新的M值,从他的顺时针方向上的下一个人开始从1报数,如此下去,直至所有人全部出列为止。

目前代码还没有完善,有些错误,先附上代码:

#include<stdio.h>
#include<stdlib.h> typedef int status; typedef struct node
{
status data;
status password;
struct node *next;
}LinkList; LinkList *create(int n)
{
LinkList *head,*p1,*p2;
int i; head=(LinkList *)malloc(sizeof(LinkList));
p1=head; for(i=;i<=n;i++)
{
p2=(LinkList *)malloc(sizeof(LinkList)); p2->data=i;
p2->password=rand()%+; p1->next=p2;
p1=p2;
}
p1->next=head->next; return head;
} void Josephus(LinkList *L)
{
LinkList *p1,*temp;
p1=L->next;
int i,m;
m=p1->password; while(p1!=p1->next)
{
for(i=;i<m-;i++)
{
p1=p1->next;
} printf("%d->",p1->next->data);
temp=p1->next;
p1->next=temp->next;
m=temp->password; free(temp);
}
printf("%d\n",p1->data);
printf("\n");
} int main()
{
LinkList *head,*p;
int n; scanf("%d",&n); head=create(n);
Josephus(head); /*
p=head->next;
for(int i=1;i<=n;i++)
{
printf("%d ",p->password);
p=p->next;
}
*/
return ;
}

这是修改之后的代码:

#include<stdio.h>
#include<stdlib.h>
#include<time.h> typedef int status; typedef struct node
{
status data;
status password;
struct node *next;
}LinkList; LinkList *create(int n)
{
LinkList *head,*p1,*p2;
int i; head=(LinkList *)malloc(sizeof(LinkList));
p1=head; srand((unsigned)time(NULL));
for(i=;i<=n;i++)
{
p2=(LinkList *)malloc(sizeof(LinkList)); p2->data=i;
p2->password=rand()%+;//在使用随机函数时最好先用srand()函数设置随机数种子,保证每次程序运行时随机函数产生的数不相同 p1->next=p2;
p1=p2;
}
p1->next=head->next;
p1=head->next;
free(head); return p2;
} void Josephus(LinkList *L)
{
LinkList *p1,*temp;
p1=L;
int i,m;
m=p1->password; while(p1!=p1->next)
{
for(i=;i<m;i++)
{
p1=p1->next;
} printf("%d->",p1->next->data);
temp=p1->next;
p1->next=temp->next;
m=temp->password; free(temp);
}
printf("%d\n",p1->data);
printf("\n");
} int main()
{
LinkList *head,*p;
int n; scanf("%d",&n);
head=create(n); p=head->next;
for(int i=;i<=n;i++)//输出password应该放在调用Josephus(head)之前,否则在Josephus()函数中free()时同时将password删除
{
printf("%d ",p->password);
p=p->next;
} printf("\n");
Josephus(head); return ;
}

一开始将srand()放在循环里面,导致每次产生的n个随机数都是一样的。

其实这是因为srand()函数是一个随机数产生函数,其意思就是指C语言里的随机数都是由它来控制产生的!!!如果在应用srand()函数之前就用随机函数rand(),则相当于使用了srand(1);
而将srand((unsigned)time(NULL));这条语句放在了for循环里,即是用了srand((unsigned)time(0));故此句语句不变的话,产生的随机数就不变!!!

后来就把srand()放在for循环之前。

Josephus2的更多相关文章

  1. JS常见算法题目

      最近收集了几个经典JS题目,比较有代表性,分享一下:   1.xiaoshuo-ss-sfff-fe  变为驼峰xiaoshuoSsSfffFe function getCamelCase(str ...

  2. C++:顺序表类实现约瑟夫问题_密码不同

    //.h #pragma once #include <iostream> using namespace std; #define MAXSIZE 100 template <cl ...

随机推荐

  1. rnqoj-82-又上锁妖塔-dp

    又是一个敢想就敢做的题目... 同时记录更新两个状态 dp[i] :第i层是飞上去的 df[i]  :第i层是走上去的 dp[i]=min(df[i-1],df[i-2]); df[i]=min(dp ...

  2. 从m个数中取top n

    将题目具体一点,例如,从100个数中取出从大到小排前10的数 方法1:使用快速排序 因为快速排序一趟下来,小于K的数都在K的前面,大于K的数都在K的后面 如果,小于K的数有35个,大于K的数有64个 ...

  3. Python自带的日志模块logging的使用

    import logging     # 创建一个logger logger = logging.getLogger('cmccLogger') logger.setLevel(logging.DEB ...

  4. [置顶] AFNetworking 2.0 新特性讲解之AFHTTPSessionManager

    AFNetworking 2.0 相比1.0 API 接口改动还是很大的. 其中一个便是 AFURLSessionManager,当然如果你不太熟悉,或者为了兼容低版本,你依然可以选择AFHTTPRe ...

  5. 遇到奇怪的C#/C/C++或者Java的bug可以去问问Coverity

    Coverity7月16号在博客Ask The Bug Guys中说以后遇到奇怪的C#/C/C++或者Java的bug可以给TheBugGuys@coverity.com发邮件.然后这些问题就会到一些 ...

  6. java中main函数解析(转载)

    从写java至今,写的最多的可能就是主函数 public static void main(String[] args) {} 但是以前一直都没有问自己,为什么要这么写,因为在c语言中就没有这样子的要 ...

  7. soapUI的使用

    首先下载soapUI下载地址在网上能够搜的到  windows下载这个soapUI-x32-3_5.exe(中间的数字是版本,能够下载最新的,这个已经有了JMS的測试功能)  首先得有一个webser ...

  8. hdoj 3157 Crazy Circuits 【有下界最小流】

    题目:hdoj 3157 Crazy Circuits 题意:如今要制造一个电路板.电路板上有 n 个电子元件,各个元件之间有单向的电流流向.然后有一个 + .电流进入, -- 电流汇入,然后推断能不 ...

  9. [置顶] Java Web开发教程来袭

    Java Web,是用Java技术来解决相关web互联网领域的技术总和.web包括:web服务器和web客户端两部分.Java在客户端的应用有java applet不过现在使用的很少,Java在服务器 ...

  10. 数缘社区上对libtom的介绍,贴过来先

    http://blog.csdn.net/songlingrebecca/article/details/5879154 基于Bit位运算的C语言库分析及其应用 1 LibTomproject的简要介 ...