C++经典问题:N个人围坐一圈,从第一个人开始顺序报数。数到3的人出圈,出圈后的下一个人继续从1开始报数,以此类推。求最后的出圈序列.
0.思路:分析题目,最后只会剩下一个人,在此之前让他们从1挨个往后报数,碰到报到3的倍数的人退出并且不再参与下轮报数,报到最后一个人然后圈子中的第一个人接着最后一个人继续报数,直到圈子只剩1人停止,然后将这些退出人的序号输出即可。
1.用图描述这一过程:(以4个人为例)
最终输出结果是: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.结束.