c++实现猴子选大王
问题描述:
一共有n只猴子,从第q个开始从1到k报数,报到k的猴子出圈,然后再从下一只开始继续报1到k,最后剩下来的那一只就是大王。
输入猴子个数n,输入从第几个开始q,输入k。
输出选出的猴王的位置。
假设q = 2,及从第2个位置开始,假设k = 3,及从1报数到3。
因为报数包括了开始的本身,我用a = 0,到a = k-1结束。
下方为代码部分,代码中有注释:
#include <iostream>
using namespace std;
int jian(int temp,int n) {
while (temp >= n) {
temp = temp - n;
}
return temp;
}//判断报数是否超标
int main()
{
//n只猴子,从第q个开始,从1-k报数报到k出圈
int n, q, k;
cin >> n >> q >> k;
int a = 0;//记录报数因为报1的时候是初始位置所以将a定义为0
int temp = q-1;//报数的位置用的是数组比实际位置少一,报数初始位置
int b;//记录报数的位置
int* arr = new int[n];//定义数组记录猴子
for (int i = 0; i < n; i++) {
arr[i] = 1;//让每个猴子都为1,当被淘汰的时候该位置数变为0
}
for (int i = 0; i < n - 1; i++) {
while (true) {
b = temp + a;
b = jian(b, n);//判断是否超标,如果超标将其变为真实的值
if (a == k - 1) {
while (arr[b] == 0) {
b++;
b = jian(b, n);//判断是否超标,如果超标将其变为真实的值
}
arr[b] = 0;
while (arr[b + 1] == 0) {
b++;
b = jian(b, n);//判断是否超标,如果超标将其变为真实的值
}
temp = b + 1;//每次报数完从下一位开始,通过上方的while循环判断让位置的值不能为0
a = 0;
break;
}
else {
if (arr[b] != 0) {
a++;
}
else {
temp++;//如果该位置已经没有猴子,不报数让其位置向前移动一位
}
}
}
}
for (int i = 0; i < n; i++) {
if (arr[i] != 0) {
cout << i + 1 << endl;
break;
}
}
//找出数组中不是0的数,并输出i+1
return 0;
}
以上就是全部内容,作者比较懒,代码可能命名不够规范.