传说约瑟夫当年活下来就是靠快速计算这个问题。
nn 个人围成一圈,编号依次为 1,2,3\ldots n1,2,3…n。从第一个人开始报数,数到 mm 的人出列,再由下一个人重新从 11 开始报数,数到 mm 的人再出圈。以此类推,直到所有的人都出列。请输出依次出圈人的编号。
输入格式
两个整数 n,m,1≤n,m≤100。
输出格式
nn 个用空格分隔的整数,表示出圈人的编号。
输入
6 4
输出
4 2 1 3 6 5
#include<stdio.h>
int main()
{
int a[1000]={0};//定义数组,并定义数组的数都等于0;
int n,m,i,x=0,y=0;
scanf("%d%d",&n,&m);//输入m,n;
for(i=1;x!=n;i++)//
{
if(i>n)//当报数>n时,又从1开始报,以实现数的序号不变;
i=1;
if(a[i]==0)//当所报的数进行判断,符合条件就类累加;
{
y++;
if(y==m)//当报数等于m时,进行定义;
{
a[i]=1;
x++;//累加数,当x=n时,循环结束;
printf("%d ",i);
y=0;//每报一轮数下来,下一个数就从1开始报;
}
}
}
return 0;
}