C++经典问题:N个人围坐一圈,从第一个人开始顺序报数。数到3的人出圈,出圈后的下一个人继续从1开始报数,以此类推。求最后的出圈序列.

0.思路:分析题目,最后只会剩下一个人,在此之前让他们从1挨个往后报数,碰到报到3的倍数的人退出并且不再参与下轮报数,报到最后一个人然后圈子中的第一个人接着最后一个人继续报数,直到圈子只剩1人停止,然后将这些退出人的序号输出即可。

1.用图描述这一过程:(以4个人为例)
C++经典问题,猴子选大王。
最终输出结果是:3,2,4.
2.代码部分:

#include <iostream>
#include <stdlib.h>
const int N=4;//设置围坐人数
using namespace std;
int main()
{
  int p[N],k=0,n=N;//p[N]用来标记,k为轮流报的数,n为圈子中的剩余人数
  for(int i=0;i<N;i++)
  {
    *(p+i)=1;//逐个标记为1
  }
  while(1)
  {
    for(int i=0;i<N;i++)
    {
      if(*(p+i)!=0)
      {
        k++;
        if(k%3==0)
        {
          cout<<i+1<<" ";
          *(p+i)=0;//出圈的人标记为0,不参与下轮报数
          n--;
        }
      }
    }
    if(n==1)//当圈子只剩1人结束
    break;
  }
  cout<<endl;
  system("pause");
  return 0;
}  

3.结束.

相关文章: