猴子选大王问题:
问题描述:
本关要求编写一个函数king,实现猴子选大王的功能。新猴王的选择方法是:让 N 只候选猴子围成一圈(最多 100 只猴子),从某位置起顺序编号为 1 ~ N 号。从第 1 号开始报数,每轮从 1 报到 3 ,凡报到 3 的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。
输出格式:
??号猴子是大王。
示例:
测试输入:5
预期输出:4号猴子是大王。
代码如下(示例):
#include <iostream>
using namespace std;
// 函数king:猴子选大王
// 参数:a-猴子数组n-1个猴子分别占据下标为~n-1的位置,n-数组长度
// 返回值:新猴王的下标序号
int king(int a[], int n);
int main()
{
// 定义变量及数组,n-猴子数量,a-猴子数组
int n, a[1000], i;
// 输入猴子数量,n>0
cin >> n;
// 初始化猴子数组,n个猴子分别占据~n的位置
a[0] = 0; // 0号位置没有猴子
for (i = 1; i <= n; i++)
a[i] = i;
// 选大王啦
i = king(a, n);
cout << i << "号猴子是大王。" << endl;
return 0;
}
int king(int a[], int n)
{
int out = 0; // 出去了几个
int flag = 0; // 报数号
int next = 1; // 下一个
// 循环n-1次,每次出去一个
while (out < n - 1)//当out=n-1时停下来,只剩最后一个猴子,那个就是大王,这也就是停止条件
{
while (a[next] == 0)
{// 这个位置的猴子已经出去了
next++; // 看下一个位置的猴子
if (next == n + 1) // 到尾部了,再回到头部
next = 1;
}//这样写可以跳过全部为0的数组,且不加报数数
flag++; // 报数号加
if (flag == 3) // 要出去了
{
a[next] = 0;
next++;
if (next == n + 1)
next = 1;
flag = 0;//再重头来过
out++;//记录出去的猴子数
}
else
{
next++;
if (next == n + 1)
next = 1;
}
}
// 找唯一的猴子
int i;
for (i = 1; i < n + 1; i++)
if (a[i] != 0)
return i;
return 0;
}
希望我的代码可以帮到各位。