题解 | 约瑟夫环
约瑟夫环
https://www.nowcoder.com/practice/e417cfe32c74416ca38247f619ddb322
#include <stdio.h>
int main() {
int n, k, m;
scanf("%d %d %d", &n, &k, &m);
int alive[n];
for (int i = 0; i < n; i++) {
alive[i] = 0; // 0表示活着
}
int current = k; // 直接使用k,因为k已经是0-based索引
int remaining = n;
while (remaining > 1) {
// 数m个活着的人
int count = 0;
while (count < m) {
if (alive[current] == 0) {
count++;
}
if (count < m) {
current = (current + 1) % n;
}
}
// 淘汰当前人
alive[current] = 1;
remaining--;
// 找到下一个活着的人
do {
current = (current + 1) % n;
} while (alive[current] == 1);
}
// 输出幸存者的索引(0-based)
for (int i = 0; i < n; i++) {
if (alive[i] == 0) {
printf("%d", i); // 直接输出索引,因为题目要求0-based
break;
}
}
return 0;
}
