【题目描述】
传说约瑟夫当年活下来就是靠快速计算这个问题。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个人全部在圈内,出圈后应修改元素为1
int k = 0, p = 0; // 变量k记录当前报数是多少,变量p记录当报到最后一个人时,反过来从前面的哪个位置开始报数
while (s) { // 当圈内有人时进行循环
while (a[p] != 0) { // 找到本次报数从第几个人开始报数
++p;
}
for (int i = p; i < n; ++i) { // 遍历数组a
if (!a[i]) { // 如果第i+1个人在圈内,
++k; // 报数加1
if (k == m) { // 恰好报到m
printf("%d ", i + 1); // 输出第i+1个人的编号
a[i] = 1; // 修改对应元素为1
--s; // 圈内的人数要相应减1
k = 0; // 报数归零,从0开始
}
}
}
}
return 0;
}
&spm=1001.2101.3001.5002&articleId=134487688&d=1&t=3&u=0508c8334c6f4a6bb2432b16fae8f7e9)
1153

被折叠的 条评论
为什么被折叠?



