题目描述
元旦晚会上,有n个学生围坐成一圈,开始玩一种数字7游戏。围坐成一圈的学生按顺时针顺序编号,第一个学生的编号为1,最后一个学生的编号为n。第一个学生从1开始报数,按顺时针方向,下一个学生接着报下一个数。每当有学生报出来的数是7的倍数,或者是一个含有数字7的数时,则该学生出列退出游戏,下一个学生接着报下一个数。当剩下最后一个学生时,这个学生要为大家表演一个节目。
关于输入
输入仅一个整数n(n≤100),学生人数。
关于输出
按学生退出游戏的顺序输出学生的编号,每行一个编号。
例子输入
5
例子输出
2
5
4
3
1
源码实现
#include<iostream>
using namespace std;
bool boom(int m) {
if (m % 7 == 0)
return true;//判断其是否为7的倍数
else {
while (m > 0) {
int b = m % 10;
m /= 10;
if (b == 7)
return true;
}//判断里面有没有数码等于7
}
return false;
}//判断m是不是一个炸弹数
void nextIndex(int&index, int n,bool*a) {
if (index == n)
index = 1;
else
index++;
while (a[index] == false) {
if (index == n)
index = 1;
else
index++;
}
}//找到下一个没有出局的人的编号
int main() {
bool a[101] = { 0 };
int n, count;
cin >> n;
count = n;
for (int i = 1; i <= n; i++) {
a[i] = true;
}//初始,编号为1~n的各位都还在场
int index = 0;//index为索引
int s = 0;//表示现在报到哪个数
//因为循环还没开始所以index和s都是0
while (count > 1) {
while (true) {
nextIndex(index,n,a);
//找到第一个没被踢出的玩家
s++;//报数
if (boom(s))
break;
}
a[index] = 0;//该玩家已出局
cout << index << endl;//输出该玩家的编号
count--;//现在回合里面少了一个人
//回合重新开始
}
for (int i = 1; i <= n; i++) {
if (a[i])
cout <<i<< endl;
}
//输出最后一个剩下的人
return 0;
}