有12人围坐成一-圈玩报数游戏,从1号人员开始顺时针报数,报到3的人员被淘汰出局;接着仍沿顺时针方向从被淘汰出局者的下一人员又重新从1开始报数,报到3的人被淘汰;如此继续,直到最后只剩下一个人时停止。请编写程序输出最后所剩那个人的编号。
假设参加游戏的人的编号沿顺时针方向依次为1到12,可以使用数组来存放各数据;
#include <iostream>
using namespace std;
int main()
{
int N,i,cnt=1,n;
N=12;//cin >> N;
n = N;
int* p = new int[N];
for(i=0;i<N;i++)
p[i] = 0;
while(n>1)
{
for(i=0;i<N;i++)
{
if(p[i]==0)
{
if(cnt%3==0)
{
cnt = 1; //从1开始报数
n--;
p[i]=1;
//cout << i+1 << " ";
}else
cnt++;
}
}
}
//输出最后一个
for (i=0;i<N;i++)
{
if(p[i]== 0)
{
cout << i+1<<endl;
break;
}
}
delete[] p;
p=0;
return 0;
}
将12个人状态都设置为1,报数后改为0。循环统计三个人则第三个人状态改为0。直到最后只有一个人
#include<iostream>
using namespace std;
int main() {
int a[13]={0},n=12,m=3,t=0,s=0,b=1;
while(s!=n) {
if(!a[b]) {
t++;
if(t==m) {
a[b] = 1;
s++;
if(s==n)
cout<<b;
t=0;
}
}
b++;
if(b>n)
b=1;
}
return 0;
}