传说约瑟夫当年活下来就是靠快速计算这个问题。
n个人围成一圈,编号依次为1,2,3…n。从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈。以此类推,直到所有的人都出列。请输出依次出圈人的编号。
输入格式
两个整数 n,m,1001≤n,m≤100。
输出格式
n 个用空格分隔的整数,表示出圈人的编号。
输入样例
6 4
输出样例
4 2 1 3 6 5
#include<stdio.h>
#define N 50
int main()
{
int a[N],m,n,x,i,count = 0;
printf("Please input two integers:\n");
scanf("%d%d",&n,&m); //输入总人数n和出局要报的数m
x = n; // 把n赋给x,避免使用时n被修改
for(i = 1;i <= n; i++)
{
a[i] = i;
}
do
{
for(i =1; i<=n; i++)
{
if(a[i]!= 0) //判断是否在上个回合出局
count++; //报数 */
if(count == m)
{
a[i] = 0; //出局的人置为0,不参与报数
count = 0;
x--; //出局一个,总人数减
printf("%d",i);
}
}
}while(x>0); //未淘汰完,循环继续
return 0;
}