又是一个半小时,不过还是很开心能做出来,
一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给一个正整数N(≤1000)。
输出格式:
在一行中输出当选猴王的编号。
输入样例:
11
输出样例:
7
//猴子选大王 #include <stdio.h> int main() { int N; scanf("%d",&N); int a[N]; int i; for(i=0;i<N;i++){ a[i]=1; } i=0; int count=0; int mark=0; int number=0;//计数退出的猴子,退出猴子为N-1时,游戏结束 while(1){ while( 1) {//当计数到达最高时,跳出循环,将i和count 清0,重新计数 if(a[i]!=0){//只有当猴子不是0的时候才可以报数 mark++ ;//标记报数,循环的时候只要猴子是1就加一 count++; if(mark%3==0){//报数是3的倍数的猴子,置0 a[i]=0; number++;//记录已经退出游戏,也就是置0的猴子有多少个 } if(number==N)//最后一个猴子在无限循环下,,每次加一,加三次达到三的倍数,实际上这只猴子是赢家,这只是循环结束的条件 goto sign; } if(i==N-1) break; i++; } i=0; } sign: printf("%d",i+1);//因为数组是从0开始计算的,i如果=1,就是第二个猴子 return 0; }