描述
某皇帝有2m个儿子,现在要从中选出一个做太子,皇帝不知道该把那一个皇子立为太子,于是决定用下面的方法来选出太子,设每个太子的编号分别1、2、3、…、2m,按顺时针方向站成一个圆圈,现在从1号太子开始按顺时针方向数,数到第n个人,把他淘汰出局,然后从他的下一个人开始上述过程,当第m个人被淘汰时,转变方向继续从1开始数,重复上述过程,最后剩下的皇子将被立为太子。现在请你写一个程序,计算出几号皇子将被立为太子。
输入
输入两个正整数m n
Input two positive integer.
Input two positive integer.
输出
输出太子的编号
Output the number.
Output the number.
输入样例
3 2
输出样例
1
#include<iostream>
#include<stdio.h>#include<string.h>
using namespace std;
int main()
{
int m,n,i,j,k;
cin>>m>>n;//有2m个人,一共数n个数,当第m个人被拉走时,转变方向继续数数
int a[10000];
for(i=0;i<2*m;i++)
{
a[i]=1;//表示所有人都未被拉走
}
int sum,counter;
sum=0;counter=0;j=0;
while(sum<2*m-1)//让他们一直数数
{
if(a[j]==1)
{
counter=counter+1;//数数
if(counter==n)
{
a[j]=0;
counter=0;
sum=sum+1;//计数有多少个人被拉走了
}
if(sum==m)
{
break;
}
}
j=(j+1)%(2*m);
}
j=j-1;
//跳出循环后逆向循环
while(sum<2*m-1)
{
if(a[j]==1)
{
counter=counter+1;
if(counter==n)
{
a[j]=0;//第四个被拉走的
counter=0;
sum=sum+1;
}
if(j==0)
{
j=(j+2*m)-1;
}
else
{
j=(j-1)%(2*m);
}
}
else
{
j=j-1;
if(j==-1)
{
j=(j+2*m);
}
}
}
//挑选出来后就要筛选输出
for(k=0;k<2*m;k++)
{
if(a[k]==1)
{
cout<<k+1<<endl;
}
}
return 0;
}