经典的报数退出问题,以前叫猴子选大王。n个人排成一圈报数,报到3的退出,循环直至最后一个,问,最后一个的原来号码是多少。

xiaoxiao2021-02-28  84

#include<stdio.h> void main() { int i,k,m,n,num[100],*p; printf("input number of person: n="); scanf("%d",&n); p=num; for(i=0;i<n;i++) *(p+i)=i+1; i=0; k=0; m=0; while(m<n-1)//m是指出局的人数,因为有n个人,最后剩下一个人,所以最多出局(n-1)个人,构成循环 { if(*(p+i)!=0)//判断这个号(原来的序号)是否出局 k++;//这个号没有出局,就报数,计数器加1 if(k==3)//报3的出局 { *(p+i)=0;//将出局的这个人标记 k=0;//使计数器置零,以便后面的人报数 m++;//出局人数计数器加1 } i++;//将指针后移,虽然i不是指针,但p+i就是指针了,所以i就是为指针服务的 if(i==n)//如果指针移到了尾部,则返回到头部 i=0; } //以上的循环是主要焦点,后面的就是找出最后那个人,这个好理解 while(*p==0)//用这个可以只判断所找号的前面的号(包括所找号),不用判断后面的。 p++; printf("The last one is N0.%d\n",*p); }
转载请注明原文地址: https://www.6miu.com/read-56748.html

最新回复(0)