今天碰到一道题目,以前也做过 但是今天碰到时竟然搞混淆的,真是该死
题目如下:
一群猴子都有编号,编号分别是1,2,3 ...n ,这群猴子(n个)按照1到n的顺序顺时针围坐一圈,从编号为1的猴子开始顺时针报数,每数到m(m<n),则该猴子就要离开此圈,再从下一个猴子开始数,每数到m, 则该猴子离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
下面就是我做的答案:如有问题欢迎提出。。。
方法一:
/// <summary> /// 从猴子中选出一只大王 /// </summary> /// <param name="m">猴子的总数量</param> /// <param name="n">游戏报数</param> /// <returns></returns> private static int SelectKing(int m, int n) { //调用Enumerable.Range()方法生成范围数并存到List<int>型变量中 List<int> listMokeny = new List<int>(Enumerable.Range(1, m)); //猴子所在的下标 int index = 0; //报数 int CurrentNumb = 0; while (listMokeny.Count != 1) { //如果猴子所在的下标大于猴子的数目-1 则重置为第一个(即下标0) if (index > listMokeny.Count-1) { index = 0; } //报数 CurrentNumb++; //如果当前报到的数等于游戏规定的数则相应的猴子退出 //注意:移除后下标就不能++了 if (CurrentNumb == n) { CurrentNumb =0; listMokeny.RemoveAt(index); continue; } index++; } return listMokeny[0]; }
方法二:
/// ///总人数M,数到N个排除 /// public int King(int M,int N) { int k=0;//定义一个遍历,用来存储号码 for(int i=2;i<=M;i++)//遍历猴子个数 { k=(k+N)%i;//计算号码值 } return ++k;//返回猴子号码 }