题目描述
N 个人围成一圈顺序编号,从1 号开始按1、2、3 顺序报数,报3 者退出圈外,其余的人再从1、2、3 开始报数,报3 的人再退出圈外,依次类推。请按退出顺序输出每个退出人的原序号。要求使用环行链表编程。
输入描述:
输入第一行为整数m表示有m组测试数据,接下来m行每行一个整数N,N不超过50。
输出描述:
输出m行,每行表示题目所求,用空格隔开。
输入
1
4
输出
3 2 4 1
代码
#include<iostream>
using namespace std;
int main()
{
int m;
cin >> m;
int N;
for (int i = 0; i < m; i++)
{
cin >> N;
int val[10000];
val[0] = 0;
int p = 1;
int num = N;
for (int i = 1; i < N + 1; i++)
{
val[i] = i;
}
while (num != 0)
{
for (int i = 1; i < N + 1;)
{
if (val[i] == 0)
{
i++;
}
else {
if (p % 3 != 0)
{
p++;
i++;
}
else if (p % 3 == 0)
{
p = 1;
cout << val[i] << " ";
val[i] = 0;
num--;
i++;
}
}
}
}
cout << endl;
}
}
代码思路
设置一个数组对应1到N号人,设置一个标志P记录报数,如果当前人报数是3,则置其值为0,p从头开始计数,若再次扫描中当前值为0则直接跳过不计数。