已知有n个人(以编号1,2,3…n表示)围坐在一张圆桌上。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,圆桌上只剩一个人。
#include<stdio.h>
int flag[450000]={0},sum=0;
int fun(int a,int b)
{
int i,num;
num=0;
for(i=1;i<=a;i++)
{
if(flag[i]==0)
num++;
}
if(n==1)
for(i=1;i<=a;i++)
if(flag[i]==0)
return i;
for(i=1;i<=a;i++)
{
if(flag[i]==0)
{
sum++;
if(sum%b==0)
flag[i]=1;
}
}
fun(a,b);
}
int main()
{
int n,m,ans;
scanf("%d%d",&n,&m);
ans=fun(n,m);
printf("%d",ans);
return 0;
}
解题思路:
首先定义一个flag数组,然后全部赋初值为0;
在进入函数之前n个人的记录都为0;
函数中num用来计算还有多少个人的记录为0,每次进入函数体中都要先将num初始化为0;
函数中的第一步是遍历这个flag的数组,如果遇到flag的值为0,则令负责计数的num++,
如果num的值为1时,说明圆桌上所有人中只有一个人的记录为0,那么他就是最后剩下的这个人,返回他的下标
如果num的值不为1,说明圆桌上还不止一个人,那么进入循环,sum用来计数,每次当它能除尽m这个数时,就说明此时这个人报数的值是m,因为sum是m的倍数