【题目描述】
传说约瑟夫当年活下来就是靠快速计算这个问题。n个人围成一圈,编号依次为1,2,3…n。从第一个人开始报数,数到m的人再出圈。以此类推,直到所有的人都出列。请输出依次出圈人的编号。
【输入格式】
两个整数n,m,均在[1, 100]。
【输出格式】
n个用空格分隔的整数,表示出圈人的编号。
样例输入:6 4
样例输出:4 2 1 3 6 5
耐心一些认真一些,其实并不难~
【C语言代码实现】
# include <stdio.h>
int main()
{int n, m;scanf("%d%d", &n, &m); // 输入两个正整数int s = n; // 变量s记录当前在圈内的人数int a[105] = {0}; // 数组a记录这n个人是否在圈内,初始值全为0,表示n个人全部在圈内,出圈后应修改元素为1int k = 0, p = 0; // 变量k记录当前报数是多少,变量p记录当报到最后一个人时,反过来从前面的哪个位置开始报数while (s) { // 当圈内有人时进行循环while (a[p] != 0) { // 找到本次报数从第几个人开始报数++p;}for (int i = p; i < n; ++i) { // 遍历数组aif (!a[i]) { // 如果第i+1个人在圈内,++k; // 报数加1if (k == m) { // 恰好报到mprintf("%d ", i + 1); // 输出第i+1个人的编号a[i] = 1; // 修改对应元素为1--s; // 圈内的人数要相应减1k = 0; // 报数归零,从0开始}}}}return 0;
}