Description
设有n个人围坐一圈并按顺时针方向从1到n编号,从第1个人开始进行1到m的报数,报数到第个m人,此人出圈,再从他的下一个人重新开始1到m的报数,如此进行下去直到所剩下一人为止。
Input
输入多行,每行2个数,分别表示n和m.
Output
计算每一行中最后剩下这个人的编号.
Sample Input
10 3
Sample Output
4
具体思路在代码里。
代码:
#include<stdio.h>
#define max 15
int main()
{
int i,k,n,m,t,num[max],*p;
while(scanf("%d%d",&n,&t)!=EOF)//开始报数前的人数。
{
p=num;//指针指向数组第一位num[0]
for(i=0;i<n;i++)//把n个人进行编号为1—n。
*(p+i)=i+1;
i=0;k=0;m=0;
while(m<n-1)//m为圈外人数。
//如果设n=9,则循环只运行到m=7。为什么不是m<n???
{
if(*(p+i)!=0)//报数。
k++;
if(k==t)
{
//printf("%d ",*(p+i));//按顺序依次输出出圈的人的编号。
*(p+i)=0;//对于出圈人数,其值置为0。
m++;//圈外人数加1。
k=0;//重新开始报数。
}
i++;//指针指向下一位。
if(i==n)//指针移到最后一位时,重新赋值
i=0;//printf("\n");
}
for(i=0;i<n;i++)//输出最后一位出圈的人的编号
if(*(p+i)!=0)
printf("%d\n",*(p+i));
}
return 0;
}