描述:
某皇帝有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 main()
{
int n,m,i,j=0,c=0,d;
cin>>m>>n;
int a[2*m];
for(i=0;i<2*m;i++)
{
a[i]=1;
}
j=-1;
for(i=0;i<2*m;i=(i+1)%(2*m))
{
if(a[i]!=0)
{
j=(j+1)%n;
}
if(j==n-1&&a[i]!=0)
{
a[i]=0;
c=c+1;
}
if(c==m)
{
break;
}
}
j=-1;
for(i=i;i<2*m;i=i-1)
{
if(a[i]!=0)
{
j=(j+1)%n;
}
if(j==n-1&&a[i]!=0)
{
a[i]=0;
c=c+1;
}
if(c==2*m-1)
{
break;
}
if(i==0)
{
i=2*m;
}
}
for(i=0;i<2*m;i=(i+1)%(2*m))
{
if(a[i]!=0)
{
d=i+1;
break;
}
}
cout<<d<<endl;
}
PS:这道题和幸运的编号两道题单步调试很多次,如果自己在纸上根据程序算的话会变得很麻烦