#include <bits/stdc++.h>
using namespace std;
const int se = 5001;
int n, m, q[se + 1], front = 1, rear = se;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
rear = rear % se + 1;
q[rear] = i;
}
int x = 0, k = 1, psum = 0;
while (rear % se + 1 != front) {
psum = n - k + 1;
++x;
int y = q[front];
front = front % se + 1;
m = k * k % psum;
if (m == 0) {
printf("%d ", q[rear]);
++k;
} else {
if (x == m) {
printf("%d ", y);
x = 0;
++k;
} else {
rear = rear % se + 1;
q[rear] = y;
}
}
}
return 0;
}
哪位big佬帮忙看一下哪里错了
约瑟夫拓展
输入:10
输出:1 5 6 8 9 10 2 3 4 7
【以下回答由 GPT 生成】
根据代码和问题描述,这里给出代码中的错误和具体解决方案:
rear = rear % se + 1;
这一行在每一次循环中,rear的值会超过数组q
的大小,导致越界,并且会影响到后面的计算。解决方案:根据约瑟夫问题的要求,当rear超过se的时候,应该重新赋值为1,而不是rear = rear % se + 1。可以修改为 rear = rear == se ? 1 : rear + 1;
。
while (rear % se + 1 != front)
这一行在循环条件中使用了rear和front,但是这两个变量的值在循环体中被改变,导致循环的判断条件不准确。解决方案:可以新增一个变量current_rear
,在每次rear改变的时候将其值赋给current_rear
,然后在循环条件中使用current_rear
和front
进行比较。
m = k * k % psum;
这一行计算m的值有问题,psum的值在每次循环中应该是不断减少的,而不是固定不变的n-k+1。解决方案:将psum
的赋值放在循环体内部,在每次计算m的时候使用当前的n - k + 1
的值。
printf("%d ", q[rear]);
这一行在输出结果时,应该输出的是经过处理后的数列值,而不是输出rear所在位置的数。解决方案:将这一行修改为 printf("%d ", q[front]);
。
修改后的代码如下:
#include <bits/stdc++.h>
using namespace std;
const int se = 5001;
int n, m, q[se + 1], front = 1, rear = se;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
rear = rear == se ? 1 : rear + 1;
q[rear] = i;
}
int x = 0, k = 1;
while (rear != front) {
int current_rear = rear;
int psum = n - k + 1;
++x;
int y = q[front];
front = front == se ? 1 : front + 1;
m = k * k % psum;
if (m == 0) {
printf("%d ", q[front]);
++k;
} else {
if (x == m) {
printf("%d ", y);
x = 0;
++k;
} else {
rear = rear == se ? 1 : rear + 1;
q[rear] = y;
}
}
rear = current_rear;
}
return 0;
}
经过以上修改,代码中的错误应该已经解决了。
【相关推荐】