蓝桥杯ACM中等题-猴子选大王
1、问题描述
现在n只猴子依次围成一圈,从一开始依次报数至n,报到n的猴子出局,并从下一个猴子开始报1,直到最后一位猴子留下成为大王。
2.算法分析
首先我们需要足够大的空间来存储这些猴子的编号,于是我们便将原来的猴子从1依次编号并存储在数组里。后利用循环让其依次报数,使用条件判断来将报到n的猴子去除,(将其赋值为1)。直到最后一个猴子。
3.输入
n=22,m=5
4.输出
猴王是9号
5.代码
#include <stdio.h>
char check(int*,unsigned int);
int main()
{
unsigned int n,m,i,flag=1;
scanf("n=%u,m=%d",&n,&m);
int a[n];
for(i=0;i<n;i++)
a[i]=i+1;
i=0;
while(check(a,n))
{
if(flag==m)
{
a[i]=0;
flag=0;
i++;
}
if(a[i]!=0)
{
i++;
flag++;
}
while(a[i]==0)
{
i++;
i%=n;
}
i%=n;
}
for(i=0;i<n;i++)
{
if(a[i]!=0)
printf("猴王是%u号",a[i]);
}
}
char check(int *p,unsigned int n)
{
int i,count=0;
for(i=0;i<n;i++)
{
if(*(p+i)!=0)
count++;
}
if(count==1)
return 0;
return 1;
}