传说约瑟夫当年活下来就是靠快速计算这个问题。
n个人围成一圈,编号依次为1,2,3…n。从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1开始报数,数到 m的人再出圈。以此类推,直到所有的人都出列。请输出依次出圈人的编号。
输入格式:
两个整数 n,m,1≤n, m≤100。
输出格式:
n个用空格分隔的整数,表示出圈人的编号。
Sample Input
6 4
Sample Output
4 2 1 3 6 5
#include<stdio.h>
int main()
{
int m ,n;
scanf("%d %d",&n,&m);//输入人数n以及m
int a[n];
int x=n;//将人数n赋值给x;
int i;
int j=0;
for(i=0;i<n;i++)
{
a[i]=i+1;//根据题目要求n个人编号为1,2,3......
}
while(x>1)//x至少需要是2才可以使游戏继续;
{
for(i=0;i<n;i++)
{
if(a[i]!=0)
{
j++;//每次报数+1;
}
if(j==m)//如果j与m相等,淘汰此人;
{
printf("%d ",a[i]);//淘汰;
a[i]=0;//为了能输出最后一个淘汰的人;
j=0;//如果淘汰一个人,下一个人从一开始报数;
x--;//淘汰一人后; x减少1;
}
}
}
for(i=0;i<n;i++)
{
if(a[i]!=0)//a[i]!=0;a[i]为最后淘汰的人的编号;
printf("%d",a[i]);
}
return 0;
}