题解 | 约瑟夫环
约瑟夫环
https://www.nowcoder.com/practice/e417cfe32c74416ca38247f619ddb322
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, k, m;
scanf("%d %d %d", &n, &k, &m);
int xuhao = k;
int eliminated = 0; // 已淘汰人数
// 动态分配数组,大小为n(只需记录n个人的状态)
int *num = (int *)malloc(n * sizeof(int));
if (num == NULL) {
printf("内存分配失败\n");
return 1;
}
for (int temp = 0; temp < n; temp++) {
num[temp] = 1; // 初始所有人都在队
}
// 淘汰n-1人(保持你循环n-1次的逻辑)
while (eliminated < n - 1) {
int step = 0;
// 找到第m个在队的人(跳过已淘汰的)
while (step < m) {
if (num[xuhao] == 1) {
step++;
}
if (step == m) break;
xuhao = (xuhao + 1) % n; // 环形移动,确保在0~n-1范围
}
// 标记淘汰
num[xuhao] = 0;
eliminated++;
// 移动到下一个起始位置
xuhao = (xuhao + 1) % n;
}
int arr[n];
for (int temp = 0; temp < n; temp++) {
arr[temp] = 0;
}
// 记录淘汰位置(因num大小为n,直接用索引即可)
for (int temp = 0; temp < n; temp++) {
if (num[temp] == 0) {
arr[temp] = temp;
}
}
// 输出未淘汰的位置
for (int temp = 1; temp < n; temp++) {
if (arr[temp] == 0) {
printf("%d", temp);
}
}
free(num);
return 0;
}
