传说约瑟夫当年活下来就是靠快速计算这个问题。
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
思路:定义全为0的数组,当出局人数不足全局人数时,继续循环,直到出局人数等于全局人数,出局的不再与其他数据进行计数,输出出列编号
#include<stdio.h>
int main(void)
{
int n,m,a[100]={0}; //定义数据全为0的数组
int i=0,k=0,s=0;
scanf("%d %d",&n,&m);
while(s!=n){ //s为出局数
i++; //i为计数用
if(i>n){ //判断i有无超出范围
i=1;
}if(a[i]==0){ //非出局判断
k++;
if(k==m){ //出列
a[i]=1;
s++;
printf("%d ",i); //输出出列编号
k=0;
}
}
}
return 0;
}