方法一:
创立一个记录编号的数组,用指针在这个数组循环移动计数,当计数为m时将这个元素做移除标记,直到剩下最后一个元素。
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 }