#include <stdio.h>
// 约瑟夫环问题的数组法实现
// n 表示总人数,m 表示报数间隔
void josephus(int n, int m) {
if (n < 1 || m < 1) return; // 参数合法性检查
int people[n]; // 初始化一个数组,模拟围成一圈的人
for (int i = 0; i < n; i++) {
people[i] = i + 1; // 假设编号从1开始
}
int index = 0; // 当前报数到的人的位置
while (n > 1) { // 当圈中人数大于1时继续
// 报数到m时,该人出列
for (int count = 1; count < m; count++) {
index = (index + 1) % n; // 环形移动指针
}
printf("出列的人是:%d\n", people[index]); // 输出出列的人
// 将出列的人从数组中移除
for (int j = index; j < n - 1; j++) {
people[j] = people[j + 1];
}
n--; // 圈中人数减一
index = (index + 1) % n; // 更新指针到下一个人的位置
}
// 最后剩下的一个人
printf("最后剩下的人是:%d\n", people[0]);
}
int main() {
int n, m;
printf("请输入总人数 n 和报数间隔 m:");
scanf("%d %d", &n, &m);
josephus(n, m);
return 0;
}
上述C语言代码实现了约瑟夫环问题的数组法解决方案。用户输入总人数`n`和报数间隔`m`,程序会模拟整个出列过程,并输出每次出列的人以及最后剩下的人。注意,此实现中数组的下标从0开始,但为了方便理解,人的编号从1开始,并在输出时进行了相应的调整。