image-20251027222753217

#include <stdio.h>
int main()
{
int N, p;
scanf("%d %d", &N, &p);

int people[3001] = { 0 };
int i;
for (i = 0; i < 3001; i++) {
people[i] = i;
}

int k = N;
int start = 1;
int flag = 1;

while (k > 0) {
int pos = (start + p - 2) % k + 1;
if (flag == 1) {
printf("%d", people[pos]);
flag = 0;
}
else {
printf(" %d", people[pos]);
}

for (i = pos; i < k; i++) {
people[i] = people[i + 1];
}
k--;
if (k == 0) {
break;
}
start = pos % (k + 1);
if (start == 0) {
start = 1;
}
}
return 0;
}

我们直接声明一个people数组,不看0下标的,那么下标就对应数字。

运用pos = (start + p - 2) % k + 1;,然后出列之后要将people数组更新。

k- -;

start等于pos % (k + 1),如果start等于0,要把它变成1,因为从下标1开始的。

直到k == 0