选太子

来源:互联网 发布:办公室坐垫 知乎 编辑:程序博客网 时间:2024/04/27 17:58
#include<iostream>
using namespace std;
//某皇帝有2m个儿子,现在要从中选出一个做太子,皇帝不知道该把那一个皇子立为太子,
//于是决定用下面的方法来选出太子,设每个太子的编号分别1 2、3、…、2m,
//按顺时针方向站成一个圆圈,现在从1号太子开始按顺时针方向数,数到第n个人,把他淘汰出局,
//然后从他的下一个人开始上述过程,当第m个人被淘汰时,转变方向继续从1开始数,
//重复上述过程,最后剩下的皇子将被立为太子。现在请你写一个程序,计算出几号皇子将被立为太子。
//3 2
//1
int main()
{
 int a[100];
 int m,n,i,sum=0,count=0;
 cin>>m>>n;
 for(i=0;i<2*m;i++)//给每个人编号
 {
  a[i]=i+1;
 }
 while(count<m)//先淘汰m个人
 {
  for(i=0;i<2*m;i++)
  {
   if(a[i]!=0)
   {
    sum++;
   }
   if(sum==n)//喊到n的被淘汰
   {
    a[i]=0;
    count++;
    sum=0;        
   }
   if(count==m)//淘汰m个之后就要退出for循环
   {
    break;
   }
  }
 }
 while(count<2*m-1)//反向淘汰
 {
  while(i>=0)
  {
   if(a[i]!=0)
   {
    sum++;
   }
   if(sum==n)
   {
    a[i]=0;
    count++;
    sum=0;
   }
   i--;  
  }
  i=2*m-1; 
 }
 for(i=0;i<2*m;i++)
 {
   if(a[i]!=0)
   {
    cout<<a[i]<<endl;
   }
 }
 return 0;
}