传说约瑟夫当年活下来就是靠快速计算这个问题。
nn 个人围成一圈,编号依次为 1,2,3\ldots n1,2,3…n。从第一个人开始报数,数到 mm 的人出列,再由下一个人重新从 11 开始报数,数到 mm 的人再出圈。以此类推,直到所有的人都出列。请输出依次出圈人的编号。
输入格式
两个整数 n,mn,m,1\le n,m \le 1001≤n,m≤100。
输出格式
nn 个用空格分隔的整数,表示出圈人的编号。
Sample Input
6 4
Sample Output
4 2 1 3 6 5
解题思路:用数组将数值套入,从第一个数报数开始循环判断报数,到11时重新报数循环,再单独将未淘汰的再套入循环。
#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); //输入总数值
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;
count = 0;
x--;
printf("%d",i);
}
}
}while(x>0); //未淘汰完,循环继续
return 0;
}