问题 I: 零基础学C/C++172——猴子选大王
题目描述
有n只猴子围成一圈,从1~n编号,大家决定从中选出一个大王。经过协商,决定选大王的规则为:从编号为1的猴子开始报数,报到k的猴子出圈,然后再从下一只开始继续报1到k......最后剩下来的那只就是大王。要求编程从键盘输入n,k,输出成为大王的猴子编号。
输入
一行输入2个正整数n和k 2<=n<=1000,2<=k<=103
输出
一行一个正整数,表示猴王的编号
样例输入 Copy
3 2
样例输出 Copy
3
提示
本题可以用循环链表实现
题解
不用看循环链表,这个到时候你会学的,这道题目的话如果直接(j+k)%n会错误,是因为a[X]=0的猴子已经出列,不能再算了
所以我们+1+1的来判断,虽然麻烦但是有用。
代码(AC)
点击查看代码
#include<stdio.h>
const int N = 100010;
int a[N];
int main()
{
int n,k,j=0,cnt=1;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
{
a[i]=1;
}
int sum=n;
while(sum>1)
{
if(a[j]==1&&cnt==k)
{
a[j]=0;
cnt=1;
sum--;
}
else if(a[j]==1)
{
cnt++;
}
j++;
j=j%n;
}
for(int i=0;i<n;i++)
{
if(a[i]==1)
{
printf("%d\n",i+1);
}
}
return 0;
}