寻找思考的意义 发表于 2017-10-20 12:22:55

求助,约瑟夫问题



这是约瑟夫的问题,左边是小甲鱼的循环写法,右边是我的,有两个问题:1:假如m=2的话,循环会执行吗?2:为什么有m%=n

寻找思考的意义 发表于 2017-10-20 12:23:50

pp图片是小甲鱼的,pp2是我的’

寻找思考的意义 发表于 2017-10-20 12:24:29

还有一个问题:两个的执行结果为什么相同

丶忘却的年少o 发表于 2017-10-20 13:03:35

问题1:不会,只有在i=1执行一次,你想一下,数到三就死掉,第一个人开始,执行一次到第二个人就好了,因为那个循环是用来寻找死掉的前一个人,然后让前一个人连着死的后一个人。
问题2:假设n个人,但是要数字是>n的,比如10个人,数到13就死掉,要是程序也一个一个数过来无疑会增加时间复杂度,所以 m = m % n;后直接去除圈数,得到余数就是从头开始数的数字,一步到位。
问题3:你说一样?你自己写的在链表data是从0开始吗?如果是从0开始,那的确会和小甲鱼老师的一样,因为他是从1开始的

寻找思考的意义 发表于 2017-10-20 13:40:05

打印是从1开始的

寻找思考的意义 发表于 2017-10-20 13:42:52

丶忘却的年少o 发表于 2017-10-20 13:03
问题1:不会,只有在i=1执行一次,你想一下,数到三就死掉,第一个人开始,执行一次到第二个人就好了,因为 ...

Node *creatLinkList(int n){

   int i;
   Node *head,*p,*r;

   head=(Node*)malloc(sizeof(Node));
   p=head;

   for(i=1;i<=n;i++){

   r=(Node*)malloc(sizeof(Node));
   r->data=i;

   p->next=r;
   p=r;

}
r->next=head->next;
   free(head);
   return r->next;
}

这是创建链表的代码,打印是从1开始的

丶忘却的年少o 发表于 2017-10-20 13:51:57

寻找思考的意义 发表于 2017-10-20 13:42
Node *creatLinkList(int n){

   int i;


我知道了,小甲鱼老师的m是数字,n是人数,你的程序m是人数,n是数字。
小甲鱼老师的在这个设定下执行 m %= n 和没执行一样所以m还是3,循环就执行1次;你的程序中 m %= n后,m = 2,也就循环一次。你自己看下你们的程序,脑子里走一遍,就从m %= n 开始到for判断这里

zqianglh 发表于 2017-10-26 04:20:26

你的代码2是巧合程序无法体现环只是个能运行的程序
页: [1]
查看完整版本: 求助,约瑟夫问题