问题描述:有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 }
运行结果: