首页 > 其他 > 详细

约瑟夫环问题

时间:2020-03-16 17:50:15      阅读:60      评论:0      收藏:0      [点我收藏+]

问题描述:有n个人排成一圈,循环报数,毎到数字k,那人自动退出,下个人继续从1开始报数,如此循环,直至剩下最后一个人。问最后那个人的序号是多少?

代码如下:

 1 //约瑟夫环问题,以n为总人数,k(此处为3)为循环退出的序号
 2 #include<stdio.h>
 3 int c[100];
 4 int *p;
 5 int n,k;
 6 int main()
 7 {
 8     p=c;
 9     void Josephus(int *,int,int);
10     printf("请输入总人数n,要退出的序号k:");
11     scanf("%d%d",&n,&k);
12     Josephus(p,n,k);
13     return 0;
14 }
15 
16 void Josephus(int *p,int n,int k)
17 {
18     int i,j,m;
19     for(i=0;i<n;i++) *(p+i)=i+1;  //将0号单元编成1号位
20     i=0;
21     j=0;
22     m=0;
23     
24     while(m<n-1)    //m从零开始,这样总共退留个人,想留x个人,条件表达式为m<n-x
25     {
26         if(*(p+i)!=0) j++;
27         if(j==k)
28         {
29             *(p+i)=0;
30             j=0;    //把这个位置设0,下一非零位置开始继续j从1计数
31             m++;
32         }
33         i++;
34         if(i==n) i=0;
35     }
36     
37     for(i=0;i<n;i++) 
38     {
39         if(*p!=0)
40         {
41             printf("最后剩下的人的编号是:%d\n",*p);
42             //break;
43         }
44         p++;
45     }
46 }

运行结果:

技术分享图片

 

约瑟夫环问题

原文:https://www.cnblogs.com/bboykaku/p/12504753.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!