题目描述
传说约瑟夫当年活下来就是靠快速计算这个问题。
nn 个人围成一圈,编号依次为 1,2,3…n。从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈。以此类推,直到所有的人都出列。请输出依次出圈人的编号。
输入格式
两个整数 n,m 1≤n,m≤100。
输出格式
n 个用空格分隔的整数,表示出圈人的编号。
输入样例
6 4
输出样例
4 2 1 3 6 5
解题思路
首先定义一个全为零的数组,从数组的1号位开始报数,如果该号位为0,则代表未出局,正常报数,此时用计数器记着报到哪位数,如果报的数等于m,则令数组中的该号位变为1,代表出局,依次循环,同时注意如果超过总人数n,要从头开始接着上一次继续报数,直到全部人出局。
代码运行
#include <stdio.h>
int main() {
int n, m, a[100] = {0}; //定义一个全为零的数组
scanf("%d %d", &n, &m);
int x = 0, i = 1, k = 0; //x为出局数,i控制长度不大于n,k为报数器
while (x != n) { //出局数要小于总人数n
if (i > n) { //控制i的长度不大于总人数n
i = 1; //从第一个人开始
}
if (a[i] == 0) { //a[i]为0代表未出局,正常报数,k++
k++;
if (k == m) { //报到的数如果等于m,此时要出局
a[i] = 1; //令此时的a[i]=1表示出局
x++; //出局数加一
printf("%d ", i); //输出出局人编号
k = 0; //再次重新报数
}
}
i++; //继续下一个人
}
return 0;
}