题目描述
三五好友,相邀畅谈,围一圆桌,饭后报数,以决买单。从第一个人开始报数(从1到3报数)凡报到3的人就不用买单,退出圈子。问最后留下要买单的是原来第几号的人。
输入
多组测试数据,输入整个n( n < 50 ),表示n个人。
输出
输出买单的人。
题解:其实这个题解题方法就是模拟游戏的过程,退出的标记起来在下一轮游戏中轮空就可以了,直到最后一个人。方法在程序的注释中具体讲解了。
#include<iostream>
using namespace std;
int main()
{
int n,a[100],flag[199]={0},i,t=0,k=0;
cin>>n;
for(i=0;i<n;i++)
a[i]=i+1;
for(i=0;i<n;)
{
if(!flag[a[i]])
t++; // t为计数器,t为3时对应的那个人就退出,标记起来
if(t==3)
{
flag[a[i]]=1; // flag数组作为标记数组,一轮游戏过后,t置零继续计数。
t=0;
k++; // k为已经退出的人数
}
if(i==n-1) //当i=n-1时,使i=0;继续循环
i=0;
else
i++; // 这里需要注意下,i++放在这里,避免放在for中跳过i=0,for的特性
if(k==n) //直到所有人都退出了
{
cout<<a[i-1]<<endl;
break;
}
}
return 0;
}