n个人围成一圈,从第一个人开始报数,数到 m的人出列,再由下一个人重新从1开始报数,数到 m的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
数组解决:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int n, m, remin, index, dele[300], flag[300] = { 0 };
scanf("%d%d", &n, &m);
remin = n;
index = 0;
while (remin >=1)
{
for (int i = 0; i < n; i++)
{
if (flag[i] == 0)
{
index++;//报数
if (index == m)
{
flag[i] = 1;//杀掉
index = 0;//重新计数
dele[remin - 1] = i + 1;//保存到一个数组
remin--;//人数减一
}
}
}
}
//结束打印
for (int i = n - 1; i >= 0; i--)
{
printf("%d\t", dele[i]);
}
return 0;
}
数学公式:
#include <stdio.h>
int main(void)
{
int i, n, m, last;
//n表示总人数,m表示报到的数
while (scanf("%d", &n) != EOF && n != 0) {
// 接收报数
scanf("%d", &m);
// 约瑟夫环问题
for (i = 2, last = 0; i <= n; i++) {
last = (last + m) % i;
}
printf("%d\n", last+1);
}
return 0;
}