报数游戏
题⽬描述:
100个⼈围成⼀圈,每个⼈有⼀个编码,编号从1开始到100,他们从1开始⼀次报数,报到为 M 的⼈⾃动退出圈圈,然后下⼀个⼈接着从1开始报数,直到剩余的⼈数⼩于 M 。请问最后剩 余的⼈在原先的编号为多少?
输⼊描述:
输⼊⼀个整数参数 M
输出描述:
如果输⼊参数 M ⼩于等于1或者⼤于等于100,输出 “ ERROR! ”;否则按照原先的编号从⼩到 ⼤的顺序,以英⽂逗号分隔输出编号字符串。
输⼊:
3
4
输出:
58,91
34,45,97
code
- 看起来蛮简单的一道题,其实还蛮需要耐心的
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{
int M;
int p[101];
while(cin >>M){
if(M<=1 || M>=100){
printf("ERROR!\n");
continue;
}
//初始化
for(int i=1;i<=100;++i)
p[i]=1;
int left=100;//剩余人数
int num=1;
while(left>=M){//剩余人数大于等于M,游戏继续
//找到下一个出局的人
int t = 1;
while(t<M){
if(p[num]==1)
++t;
num = (num+1)%101;//注意整除101,不是100
if(num==0)
num=1;//从1-100计数
}
while(p[num]==0){//注意最后还要判断一下
num = (num+1)%101;
}
p[num]=0;
--left;
printf("%d\n",num);
}
//输出剩下的人
bool isFirst=true;
for(int i=1;i<=100;++i){
if(p[i]==1){
if(isFirst){
printf("%d",i);
isFirst = false;
}
else {
printf(",%d",i);
}
}
}
printf("\n");
}
return 0;
}