一群猴子排成一圈,按1,2,...n 编号,数到m只,踢出局,直到剩下最后一个猴子是大王。
输入:n m(n < 100)
输出:依次出局的猴子编号
这个问题涉及到循环数组
#include<stdio.h>
int main()
{
int n, m, i = 0;
scanf("%d %d",&n, &m);
int arr[n]; //设置动态数组arr
for(i = 0; i< n; i++)
{
arr[i] = 0; //初始化数组为0,0代表每一个未淘汰的猴子
}
int tell = 1; //想象成每个猴子报数,第一个猴子tell = 1
int now = n; //now为每次淘汰后还在的猴子数量
for(; now > 0;) //now不为0的时候,循环。now为0 ,结束循环
{
for(i = 0; i< n; i++) //嵌套循环,每次都遍历1到n
{
if(arr[i] == 0 && tell == m )//当这个位置上的猴子没有淘汰,但喊到了m,该淘汰时
{
arr[i] = 1; //将其置为1,表示已淘汰
now = now - 1; //现存猴子数量减一
tell = 1; //将报数从1重新开始
printf("%d ",i+1); //将该猴子的位置打印出来
}
if(arr[i] == 0) //如果这个位置上的猴子没有淘汰,且不该淘汰
{
tell++; //单纯报数号加一
}
}
}
return 0;
}