选太子(select the prince)
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
某皇帝有2m个儿子,现在要从中选出一个做太子,皇帝不知道该把那一个皇子立为太子,于是决定用下面的方法来选出太子,设每个太子的编号分别1、2、3、…、2m,按顺时针方向站成一个圆圈,现在从1号太子开始按顺时针方向数,数到第n个人,把他淘汰出局,然后从他的下一个人开始上述过程,当第m个人被淘汰时,转变方向继续从1开始数,重复上述过程,最后剩下的皇子将被立为太子。现在请你写一个程序,计算出几号皇子将被立为太子。
输入:
输入两个正整数m n
Input two positive integer.
输出:
输出太子的编号
Output the number.
输入样例:
3 2
输出样例:
1
答案如下:
#include<iostream> #include<cmath> using namespace std; int a[1000]; int m, n; void init(); void output();
int main() { int i, j, counter, k; cin >> m>> n; init(); counter = 0; k = 1; i = 0; while(counter < m) { if(a[i] == 1) { if(k == n) { a[i] = 0; counter++; k = 1; } else { k++; } } if(counter==m) { i=(i-1) % (2*m); } else { i=(i+1)%(2*m); } } while(counter<2*m-1) { if(a[i] == 1) { if(k == n) { a[i] = 0; counter++; k = 1; } else { k++; } } i = (i - 1+100*m) % (2*m); } output(); return 0; }
void init() { int i;
for(i = 0; i < 2*m; i++) { a[i] = 1; } }
void output() { int i;
for(i = 0; i <2*m; i++) { if(a[i] == 1) { cout << i + 1 << endl; break; } } }