选太子

来源:互联网 发布:java架构师需要几年 编辑:程序博客网 时间:2024/04/27 14:22

描述:

某皇帝有2m个儿子,现在要从中选出一个做太子,皇帝不知道该把那一个皇子立为太子,于是决定用下面的方法来选出太子,设每个太子的编号分别1、2、3、…、2m,按顺时针方向站成一个圆圈,现在从1号太子开始按顺时针方向数,数到第n个人,把他淘汰出局,然后从他的下一个人开始上述过程,当第m个人被淘汰时,转变方向继续从1开始数,重复上述过程,最后剩下的皇子将被立为太子。现在请你写一个程序,计算出几号皇子将被立为太子。

输入:

输入两个正整数m n

Input two positive integer.

输出:

输出太子的编号
Output the number.

输入样例:

3 2

输出样例:

1

#include <iostream>
using namespace std;int m, n;int a[10000];void init();int lucknum();int lastone();
int main(){    int num;
    cin >> m >> n;
    init();
    num = lucknum();
    cout << num << endl;    return 0;}
int lucknum(){    int num;    int i;    int dcnt;    int ncnt;    int counter;    dcnt = 0;    counter = 0;    ncnt = 0;    i = 0;    while(counter < 2 * m - 1)    {        if(a[i] == 1)        {            ncnt ++;            if(ncnt == n)            {                ncnt = 0;                a[i] = 0;                counter ++;                if(counter == m)                    dcnt ++;            }        }        if(dcnt % 2 == 0)            i = (i + 1) % (2 * m);        else            i = (i + (2 * m - 1)) % (2 * m);    }    num = lastone();    return num;}
int lastone(){    int i;    for(i = 0; i < 2 * m; i ++)    {        if(a[i] == 1)            break;    }    return (i + 1);}
void init(){    int i;    for(i = 0; i < 2 * m; i ++)    {        a[i] = 1;    }}

原创粉丝点击