【问题描述】
有n只猴子围成一圈,从1~n编号,大家决定从中选出一个大王。决定选大王的规则为:从编号为1的猴子开始报数,报到k的猴子出圈,然后再从下一只开始继续报1到k,最后剩下来的那一只就是大王。
【输入】
一行,包含两个正整数n和k(2≤n≤1000,2≤k≤109)。
【输出】
一行,一个正整数,表示猴王的编号。
For example:
Input Result
3 2 3
这题难度还是有点大的,可以看注释好好理解一下
#include <iostream>
using namespace std;
#define M 1010
struct monkey
{
int code;
int flag;
}a[M]; //使得a[M]能够利用code和flag
int main()
{
int i,j,index=0,n,k;
cin>>n>>k;
for(index=0;index<n;index++)
{
a[index].flag = 0;
a[index].code = index+1;//猴子编号要从1~n
}
for(i=0;i<n-1;i++) //报n-1次才能选出大王
{
for(j=0;j<k;j++) //每次都报k下
{
while(a[index].flag==1) //判定这只猴子是否被淘汰
{
index=(index+1)%n;
//是的话下标就+1,跳过该猴子,注意该猴子围成圈,不能直接++,要加上1再取余n
//如果连续被淘汰,就连续加1
}
index=(index+1)%n;//如果没有被淘汰,下标只需要加一次1
}
a[(index+n-1)%n].flag=1; //循环结束时index仍然+1,所以这里要+n-1再取余n才是报k的猴子
}
for(index=0;index<n;index++)
{
if(a[index].flag==0) //循环判断猴子是不是被淘汰,不是的话该猴子就是大王
{
cout<<a[index].code;
}
}
return 0;
}