#include <bits/stdc++.h>
using namespace std;
const int size = 5001;
int n, m, q[size + 1], front = 1, rear = size;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
rear = rear % size + 1;
q[rear] = i;
}
int x = 0, i = 1, psum;
while (rear % size + 1 != front) {
psum = n - i + 1;
x++;
int y = q[front];
front = front % size + 1;
m = (i * i) % psum;
if (!m) {
printf("%d ", q[rear]), i++;
x = 0;
rear --;
} else if (x == m) {
printf("%d ", y), i++;
x = 0;
} else
rear = rear % size + 1, q[rear] = y;
}
return 0;
}
会出错,大家指正指正
你可以提交这个代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int a[n+1]={0};
for(int i=1;i<=n;i++) a[i]=i;
int num=n;//num为剩余人数
int count=1;//count为当前要报的数字
int tmp=0;//tmp为当前该哪个位置报数了
int l=1;//l表示当前是第几轮
while(num!=0)
{
tmp++;
if(tmp>n) tmp=1;
int val=pow(l,2);
if(a[tmp]!=-1)
{
if(count==val)
{
cout<<a[tmp]<<" ";
a[tmp]=-1;
l++;
num--;
count=0;
}
count++;
}
}
return 0;
}
【以下回答由 GPT 生成】
这段代码的目标是解决沃瑟夫问题(Josephus problem),但是其中存在一些错误,我会逐个指出并给出修复建议。
#include <bits/stdc++.h>
这是一个非标准的包含语句,不建议使用。可以改为包含特定的标准库头文件,例如:
#include <iostream>
#include <cstdio>
size命名冲突:代码中定义了一个名为size
的变量,这可能与标准库中的size
方法产生冲突。建议将变量名改为其他的无冲突的名称。
非法访问数组:代码中的队列使用了环形数组实现,但是在将rear
指针减小时,没有考虑指针小于1的情况。建议在执行减小指针操作之前检查rear
的值是否大于1。
数组越界访问:代码中使用q[rear]
访问数组q
的时候,没有检查rear
是否超出了数组的范围。建议在访问数组元素之前检查rear
的值是否在合法的范围内。
基于以上的问题和修复建议,下面是修复后的代码:
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 5001;
int n, m, q[N + 1], front = 1, rear = N;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
rear = (rear % N) + 1;
q[rear] = i;
}
int x = 0, i = 1, psum;
while ((rear % N) + 1 != front) {
psum = n - i + 1;
x++;
int y = q[front];
front = (front % N) + 1;
m = (i * i) % psum;
if (!m) {
printf("%d ", q[rear]);
i++;
x = 0;
rear = (rear == 1) ? N : rear - 1;
} else if (x == m) {
printf("%d ", y);
i++;
x = 0;
} else {
rear = (rear % N) + 1;
q[rear] = y;
}
}
return 0;
}
希望这些修复建议可以解决你的问题。如果还有其他疑问,请随时提出。
【相关推荐】