一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1-N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给一个正整数N(<=1000)。
输出格式:
在一行中输出当选猴王的编号。
输入样例:11输出样例:
7
C程序:
#include int main(void) { int next[1000]; /* 用于保存一个猴子后一位是谁 */ int prev[1000]; /* 用于保存一个猴子前一位是谁 */ int n; int i, current; int prior, back; scanf("%d", &n); for(i = 0; i < n - 1; ++i) { next[i] = i + 1; /* 0号猴子的下一位是1号猴子... */ prev[i + 1] = i; /* 1号猴子的前一位是0号猴子... */ } next[n - 1] = 0; /* 形成圆圈,第n-1号猴子的下一位是0号猴子 */ prev[0] = n - 1; /* 形成圆圈,第0号猴子的下一位是n-1号猴子 */ current = 0; while(1) { /* 报3次号,取3-1次next之后就是要退出的猴子 */ for(i = 0; i < 3 - 1; ++i) { current = next[current]; } prior = prev[current]; /* 要退出的猴子的前一位猴子 */ back = next[current]; /* 要退出的猴子的下一位猴子 */ /* current号猴子退出 */ /* 前一位prior的下一位指向current的下一位back */ /* 下一位back的前一位指向current的前一位prior */ next[prior] = back; prev[back] = prior; /* 如果剩下两个猴子,每个猴子的前一位和下一位是同个猴子 */ /* current(back)是要退出的猴子,剩下的就是猴王(prior)*/ if(prior == back) { printf("%d\n", prior + 1); /* 编号从0开始,输出时加1 */ break; } current = back; } return 0; }