题目:
N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M的人出圈;…输出依次出圈的人的编号。
【输入】
输入N和M。
【输出】
输出一行,依次出圈的人的编号。
【输入样例】
8 5
【输出样例】
5 2 8 7 1 4 6 3
理解:M个人围坐,从第一个人开始报数,数到N的人出圈,出圈的人不能再参加,从出圈之后的那个人开始再从1报数,直到下一个数到N的人出圈,以此类推,直到剩余一人无法出圈为止,按顺序依次输出出圈人的编号,包括最后剩下的那个人。
如下图:
本质是遍历数组,将所需的数字变为1,下一次遍历时跳过。
#include<stdio.h>
int main()
{
int a[10000]={0},n,m,x=1,y,i;//x=1是报数的开始。y是指次数,控制循环结束。
scanf("%d%d",&n,&m);
y=n;
for(i=1;i<=n;i++)
{
if(a[i]!=1)
{
if(x==m)//?
{
printf("%d ",i);
a[i]=1;
x=0;
y--;
}
x++;//重新报数。
}
if(i==n)//重新遍历。
i=0;
if(y==0)
break;
}
return 0;
}