传说约瑟夫当年活下来就是靠快速计算这个问题。
n个人围成一圈,编号依次为 1,2,3…n。从第一个人开始报数,数到 m的人出列,再由下一个人重新从 1开始报数,数到 m 的人再出圈。以此类推,直到所有的人都出列。请输出依次出圈人的编号。
输入格式
两个整数 n,m,1≤n,m≤100。
输出格式
n 个用空格分隔的整数,表示出圈人的编号。
#include <stdio.h>
int main() {
int a[50], m, n, x, i, count = 0;
scanf("%d %d", &n, &m); //输入总人数n和出局要报的数m
x = n; //把n赋给x,防止使用时n被修改
for (i = 1; i <= n; i++) { //数组遍历,此时在数组中的位置就是人原来的编号
a[i] = i;
}
while (x > 1) {
for (i = 1; i <= n; i++) {
if (a[i] != 0) { //判断是否出圈,已经出局的就不用报数了
count++; //报数
}
if (count == m) {
a[i] = 0; //出圈的人置为0,而后不参与报数
count = 0;
printf("%d ", i);//输出出圈人的原始代码
x--; //出圈一个,总人数减1
}
}
} //循环结束后,出圈的人都已经被置为0,留下唯一一个人
for (i = 1; i <= n; i++)
if (a[i] != 0)
printf("%d ", i); //输出留下的人的原始编号
return 0;
}