- 1 int main()
- 2 {
- 3 int n,m;
- 4 scanf("%d %d",&n,&m);
- 5 int v[n];
- 6 int i;
- 7 for(i=0; i<n; i++)
- 8 {
- 9 v[i]=i+1;
- 10 }
- 11 int *p=&v[0];
- 12 int z=0,x=1,co=1;//z为剔除元素个数,x为元素在数组中位置,co为计数
- 13 for(;;)
- 14 {
- 15 while(*p==0)//当在循环中遇到已经剔除的元素,略过
- 16 {
- 17 if(x==n)
- 18 {
- 19 x=1;
- 20 p=&v[0];
- 21 continue;
- 22 }
- 23 p++;
- 24 x++;
- 25 }
- 26 if(co==m)//当计数等于m,剔除该元素
- 27 {
- 28 co=0;
- 29 *p=0;
- 30 z++;
- 31 }
- 32 if(co!=m)//若计数不等于m,继续计数
- 33 {
- 34 if(x==n)//当这个猴子时最后一个,转向让第一个猴子报数
- 35 {
- 36 x=1;
- 37 p=&v[0];
- 38 co++;
- 39 continue;
- 40 }
- 41 p++;
- 42 x++;
- 43 co++;
- 44
- 45 }
- 46 if(z==n-1)
- 47 break;//当剩下一个猴子时
- 48 }
- 49 for(i=0;; i++)
- 50 {
- 51 if(v[i]!=0)
- 52 {
- 53 printf("%d",v[i]);
- 54 break;
- 55 }
- 56 }
- 57 return 0;
- 58 }