有哪个大佬能帮我这个蒟蒻改一改呀! 如果对我有帮助的话,我一定会关注的呀,求求你们啦!
我这里用的是C++语言,各位大佬帮我改一改吧(qwq)!
描述: 有 n 个人排成一圈,从 1 到 n 编号。从第一个人开始依次报数(第一个人报的数是 1 ,下一个人报的数是 2 ,...,当前这个人报的数字等于前面那个人报的数字加一),报数一共进行 n 轮,对于第 i (1≤i≤n) 轮,数到 i2 的人出列,下一个人继续从 1 开始报数。结束的时候所有人都会出列。
请依次输出每一轮出列的人的编号。
输入格式 第一行一个整数 n 。
输出格式 输出一行,包含 n 个数,表示每一轮出列的人的编号。
样例输入 10 样例输出 1 5 6 8 9 10 2 3 4 7 数据规模 对于 30% 的数据,保证 1≤n≤100 。
对于 100% 的数据,保证 1≤n≤5000 。
代码:
#include <iostream>
using namespace std;
struct Node {
int v;
Node *p, *n;
} a[5010];
int n, m;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
a[i].v = i;
if (i == n) {
a[i].n = &a[1];
} else {
a[i].n = &a[i + 1];
}
if (i == 1) {
a[i].p = &a[n];
} else {
a[i].p = &a[i - 1];
}
}
Node *pd = &a[n];
int x = 0, k = 1;
while (1) {
pd = pd->n;
++x;
m = k * k;
if (x == m) {
printf("%d ", pd->v);
if (pd->n == pd) {
break;
} else {
Node *l = pd->p, *r = pd->n;
l->n = r;
r->p = l;
pd->p = pd->n = NULL;
x = 0;
pd = l;
}
k++;
}
}
return 0;
}