有趣的C#数组问题:n只猴子选大王......
n只猴子选大王,选举办法如下:从头到尾1、2、3报数,凡报3的退出;余下的从头到尾1、2、3报数,凡报3的退出;余下的又从头到尾报数,还是报3的退出;依次类推,当剩下两个...
n只猴子选大王,选举办法如下:从头到尾1、2、3报数,凡报3的退出;余下的从头到尾1、2、3报数,凡报3的退出;余下的又从头到尾报数,还是报3的退出;依次类推,当剩下两个猴子时,取这时报1的为王,若想当猴王,请问当初应占据什么位置?(用数组完成此程序,其中n从键盘输入)
请求写出具体的解决思路 展开
请求写出具体的解决思路 展开
展开全部
猴子选大王问题: 一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1到m的顺序围坐一圈,
从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王
using System;
using System.Collections.Generic;
using System.Text;
namespace ExMonkey
{
class Monkey
{
public int King(int M, int N)
{
//总人数 M ,数到第 N 个排除。
int k=0;
for (int i = 2; i <= M; i++)
k = (k + N) % i;
return ++k;
}
static void Main(string[] args)
{
Monkey M = new Monkey();
Console.WriteLine ("第"+M.King(10,3)+"号猴子为大王。");
}
}
}
以上 是我在网上找的。。不过 跟你的问题 有点出入。。你看懂了的话,自己就会改了
从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王
using System;
using System.Collections.Generic;
using System.Text;
namespace ExMonkey
{
class Monkey
{
public int King(int M, int N)
{
//总人数 M ,数到第 N 个排除。
int k=0;
for (int i = 2; i <= M; i++)
k = (k + N) % i;
return ++k;
}
static void Main(string[] args)
{
Monkey M = new Monkey();
Console.WriteLine ("第"+M.King(10,3)+"号猴子为大王。");
}
}
}
以上 是我在网上找的。。不过 跟你的问题 有点出入。。你看懂了的话,自己就会改了
展开全部
"当剩下两个猴子时,取这时报1的为王" 可以先取出前两个数字, 然后剩下n-2循环删除首数字即可,一直循环到删除空,然后从头开始数"1",抛出来就是"王". 情况就这么个情况,别嫌程序简单, 好好编写 无误就是成功!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
晕,这个不需要程序,剩下的2个永远都是一开始报1,2的
你的题目肯定有问题
你的题目肯定有问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
第一个猴子是大王。真是有趣
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
/// <summary>
/// 直接调用这个方法,传入2个参数
/// </summary>
/// <param name="numberPerson">猴子的个数</param>
/// <param name="unluckyNumber">那个不幸的数字,也就是报到那个数字就要出局的</param>
/// <returns></returns>
private static int Play(int numberPerson, int unluckyNumber)
{
int i = 0; // 循环变量,作为数组的索引
int currentNumber = 0; // 报数计数
int numberRemain = numberPerson; // 剩下的人数
int numberWin = 0; // 赢的人的编号
// 声明数组,存放每个人的状态
bool[] personState = new bool[numberPerson];
// 游戏开始,每个人的状态都为true
for (i = 0; i < personState.Length; i++)
{
personState[i] = true;
}
// 开始游戏
while (numberRemain > 1)
{
for (i = 0; i < personState.Length; i++)
{
if (personState[i] == true) // 状态为true,报数
{
currentNumber++; // 报出的数字
if (currentNumber % unluckyNumber == 0)
{
personState[i] = false; // 报到幸运数字的倍数人退出
numberRemain--; // 退出的人数累加1
}
}
}
}
// 找到唯一一个没有退出的人,状态为true
for (i = 0; i < personState.Length; i++)
{
if (personState[i])
{
numberWin = i + 1;
break;
}
}
return numberWin;
}
这个题跟我一前做的一个报数题是一样的所以没给你改东西,就是以前写过的代码
题目如下:
有一群人被困在了一个小岛上,他们只有一个竹排可以逃生,竹排只能坐一个人,
于是他们决写通过玩退圈游戏来决定哪个人可以坐上竹排逃生。这些人围成了一个圆圈,
从1开始每个人顺序编号,他们商定了一个不幸的数字X,然后,
从编号为1的人开始报数,报到X的倍数就退出游戏,直到最后剩下一个人,
这个人就是可以得到竹排的人。编写程序,
在Main方法中输入玩游戏的人数和不幸的数字X,
自定义Play方法按游戏规则进行游戏,方法返回赢的人编号。
/// 直接调用这个方法,传入2个参数
/// </summary>
/// <param name="numberPerson">猴子的个数</param>
/// <param name="unluckyNumber">那个不幸的数字,也就是报到那个数字就要出局的</param>
/// <returns></returns>
private static int Play(int numberPerson, int unluckyNumber)
{
int i = 0; // 循环变量,作为数组的索引
int currentNumber = 0; // 报数计数
int numberRemain = numberPerson; // 剩下的人数
int numberWin = 0; // 赢的人的编号
// 声明数组,存放每个人的状态
bool[] personState = new bool[numberPerson];
// 游戏开始,每个人的状态都为true
for (i = 0; i < personState.Length; i++)
{
personState[i] = true;
}
// 开始游戏
while (numberRemain > 1)
{
for (i = 0; i < personState.Length; i++)
{
if (personState[i] == true) // 状态为true,报数
{
currentNumber++; // 报出的数字
if (currentNumber % unluckyNumber == 0)
{
personState[i] = false; // 报到幸运数字的倍数人退出
numberRemain--; // 退出的人数累加1
}
}
}
}
// 找到唯一一个没有退出的人,状态为true
for (i = 0; i < personState.Length; i++)
{
if (personState[i])
{
numberWin = i + 1;
break;
}
}
return numberWin;
}
这个题跟我一前做的一个报数题是一样的所以没给你改东西,就是以前写过的代码
题目如下:
有一群人被困在了一个小岛上,他们只有一个竹排可以逃生,竹排只能坐一个人,
于是他们决写通过玩退圈游戏来决定哪个人可以坐上竹排逃生。这些人围成了一个圆圈,
从1开始每个人顺序编号,他们商定了一个不幸的数字X,然后,
从编号为1的人开始报数,报到X的倍数就退出游戏,直到最后剩下一个人,
这个人就是可以得到竹排的人。编写程序,
在Main方法中输入玩游戏的人数和不幸的数字X,
自定义Play方法按游戏规则进行游戏,方法返回赢的人编号。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询