首先将代码放在前边
#include <iostream>
using namespace std;
// 函数king:猴子选大王
// 参数:a-猴子数组n-1个猴子分别占据下标为~n-1的位置,n-数组长度
// 返回值:新猴王的下标序号
int king(int a[], int n);
int main()
{
int n, a[1000], i; // 定义变量及数组,n-猴子数量,a-猴子数组
cin >> n; // 输入猴子数量,n>0
// 初始化猴子数组,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)
{
// 请在此添加代码,实现函数king
/********** Begin *********/
int num=n,nx=1,m=1;
while(num>1){
for(int i=1;i<=3;i++){
while(a[nx]==0){
nx++;
if (nx==n+1)nx=1;
}
if(i==3){
a[nx]=0;
num--;
}else {
nx++;
}
if (nx==n+1)nx=1;
}
}
for (int j=1;j<=n;j++){
if(a[j]!=0){
return j;
}
}
本题利用循环可以解决这个问题,判断依据为只剩一个猴子,也就是只有一个数不为0时即可。但本人在练习过程中,最初开始没加上:if (nx==n+1)nx=1; 导致在下一次循环开始判断a[nx]==0时出了错误。比如有5个猴子,当nx=6时进行判断a[nx]==0出错,a[nx]没有赋值,个人一开始以为没赋值就是0,在那个while判断中可以进行出来,但结果不是。
我编了一小段代码来进行检验
#include <iostream>
using namespace std;
int main() {
int a[10];
for (int i = 0; i <= 5; i++) {
cin >> a[i];
}
for (int i = 0; i < 10; i++) {
cout << a[i] << " ";
}
return 0;
}
输入为0 1 2 3 4 5
输出为:0 1 2 3 4 5 -858993460 -858993460 -858993460 -858993460
我个人认为这是一个值得注意的点。