约瑟夫环问题

问题描述:有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
",*p);
42             //break;
43         }
44         p++;
45     }
46 }

运行结果:

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