传说约瑟夫当年活下来就是靠快速计算这个问题。
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
两个注意点
1、让数到m的人出圈。
2、让游戏中的人像一个圈一样不断进行报数。
采用数组解决
设数组中的元素全都是0,以此来表示他们全都没有出圈,一旦这个人数到m,就让这个元素=1,表示出圈。
while(cnt!=n) //出局人数未达到n时,需要循环不断计数
{
i++;
if(i>n) i=1; //i的值不断累加,一旦i>n则重新计数
if(a[i]==0) //只有元素为0的人需要报数,非0代表已出局
{
k++;
if(k==m) //以m为一个循环
{
a[i]=1; //元素为i的人出局
cnt++; //出局人数+1
printf("%d ",i);
k=0; //重新开始计数
}
}
}
总代码
#include<stdio.h>
int a[110]={0};
int main()
{
int n,m;
int cnt=0,i=0,k=0; //cnt统计出局人数,i代表个人编号,k用来计数
scanf("%d %d",&n,&m);
while(cnt!=n) //出局人数未达到n时,需要循环不断计数
{
i++;
if(i>n) i=1; //i的值不断累加,一旦i>n则重新计数
if(a[i]==0) //只有元素为0的人需要报数,非0代表已出局
{
k++;
if(k==m) //以m为一个循环
{
a[i]=1; //元素为i的人出局
cnt++; //出局人数+1
printf("%d ",i);
k=0; //重新开始计数
}
}
}
printf("\n");
return 0;
}