题目如下
题目内容:n只猴子(n<100)要选大王,选举方法如下:所有猴子按1,2,3,……, n编号围坐圈,从第1号开始按照1,2,……, m报数,凡报到m号的退出圈外,如此循环报数,直到圈内剩下一只猴子时,这只猴子就是大王。编程一个程序实现上述过程,n和m由键盘输入。
输入:猴子的数量n及报数的最大数字
输出:退出圈外的猴子编号序列(每数字后紧跟1个空格)
样例 输入: 5 3
输出: 3 1 5 2 4
代码如下:
#include<stdio.h>
int main()
{
int flag[99],count,out,m,n,t;
//flag数组用于判断当前数字是否输出过
//count用于记录报数
//out当前剩余猴子
//t当前轮数轮到第几只猴子,计数
scanf("%d",&n);
scanf("%d",&m);
out=n;//初始剩余量等于总量
count =0;//初始报数为0
for(t=0;t<n;t++)//为检查数组赋值
{
flag[t]=1;
}
t=1;//从1开始计数
while(out!=0)//循环条件剩余量不为0
{
if(t>n)//判断当前计数是否超过总数
{
t=1;//从1开始计数
}
if(flag[t-1]==0)//已报数
{
t++;
}
else if(flag[t-1]==1)//未报数
{
count++;//记录
if(count==m)//当前记录数等于要求报数
{
printf("%d",t);
printf(" ");
flag[t-1]=0;//已报数
t++;
out--;//剩余量减少
count=0;//记录归零
}
else//不等于
{
t++;
}
}
}
return 0;
}