猴子选大王C#题目,求指点,要求有注释
一群猴子都有编号,编号分别是1,2,3...n,这群猴子(n个)按照1到n的顺序顺时针围坐一圈,从编号为1的猴子开始顺时针报数,每数到m(m<n),则该猴子就要离开此圈,...
一群猴子都有编号,编号分别是1,2,3 ...n ,这群猴子(n个)按照1到n的顺序顺时针围坐一圈,从编号为1的猴子开始顺时针报数,每数到m(m<n),则该猴子就要离开此圈,再从下一个猴子开始数,每数到m, 则该猴子离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王
展开
展开全部
number就是题目中的m,返回值就是猴子的序号,代码中固定为6只猴子,呵呵,这个可以自己扩展
private IList<int> Monkeys;
private int ElectKing(int number)
{
Monkeys = new List<int>(new int[] { 1, 2, 3, 4, 5, 6 });
int nIndex = 0;
int nNumber = 0;
while (Monkeys.Count > 1)
{
//如果上一次报数的猴子是最后一只的话
if (nIndex > Monkeys.Count - 1)
{
//从第一只开始
nIndex = 0;
}
//报数
nNumber++;
//移除数到某一个数的猴子
if (nNumber == number)
{
nNumber = 0;
Monkeys.RemoveAt(nIndex);
continue;
}
//下一个猴子准备
nIndex++;
}
return Monkeys[0];
}
private IList<int> Monkeys;
private int ElectKing(int number)
{
Monkeys = new List<int>(new int[] { 1, 2, 3, 4, 5, 6 });
int nIndex = 0;
int nNumber = 0;
while (Monkeys.Count > 1)
{
//如果上一次报数的猴子是最后一只的话
if (nIndex > Monkeys.Count - 1)
{
//从第一只开始
nIndex = 0;
}
//报数
nNumber++;
//移除数到某一个数的猴子
if (nNumber == number)
{
nNumber = 0;
Monkeys.RemoveAt(nIndex);
continue;
}
//下一个猴子准备
nIndex++;
}
return Monkeys[0];
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
import java.util.LinkedList;
/**
*
* @author Love yali_deng forever
*
*/
public class Yuesefu {
/**
* 约瑟夫环是一个数学的应用问题
*
* @param args
*/
private static StringBuffer removedStr = new StringBuffer("");// 记录出列的数字
public static void main(String[] args) {
long startTime = System.currentTimeMillis(); // 获取开始时间
process(5000,10,1);
System.out.println(removedStr.substring(0,removedStr.length() - 1));
long endTime = System.currentTimeMillis(); // 获取结束时间
System.out.println("程序运行时间:" + (endTime - startTime) + "ms");
}
public static void process(int n,int k,int m) {
// 构建一个list,存放人数
LinkedList<Integer> list = new LinkedList<Integer>();
for (int i = 0; i < n; i++) {
if (i + k > n) {
list.add(i + k - n);
} else {
list.add(i + k);
}
}
int count = 1;// 记录数的人数
cycleCal(list,count,m);
}
public static void cycleCal(LinkedList<Integer> list,int count,int m) {
int len = list.size();
if (len > 1) {
for (int i = 0; i < len; i++) {
if (count == m) {// 第m个时,remove
removedStr.append(list.get(i)).append(",");
list.remove(i);
len = list.size();
i--;
count = 0;
}
count++;
}
cycleCal(list,count,m);
} else {
if (len != 0) {
removedStr.append(list.get(0)).append(",");
}
}
}
}
/**
*
* @author Love yali_deng forever
*
*/
public class Yuesefu {
/**
* 约瑟夫环是一个数学的应用问题
*
* @param args
*/
private static StringBuffer removedStr = new StringBuffer("");// 记录出列的数字
public static void main(String[] args) {
long startTime = System.currentTimeMillis(); // 获取开始时间
process(5000,10,1);
System.out.println(removedStr.substring(0,removedStr.length() - 1));
long endTime = System.currentTimeMillis(); // 获取结束时间
System.out.println("程序运行时间:" + (endTime - startTime) + "ms");
}
public static void process(int n,int k,int m) {
// 构建一个list,存放人数
LinkedList<Integer> list = new LinkedList<Integer>();
for (int i = 0; i < n; i++) {
if (i + k > n) {
list.add(i + k - n);
} else {
list.add(i + k);
}
}
int count = 1;// 记录数的人数
cycleCal(list,count,m);
}
public static void cycleCal(LinkedList<Integer> list,int count,int m) {
int len = list.size();
if (len > 1) {
for (int i = 0; i < len; i++) {
if (count == m) {// 第m个时,remove
removedStr.append(list.get(i)).append(",");
list.remove(i);
len = list.size();
i--;
count = 0;
}
count++;
}
cycleCal(list,count,m);
} else {
if (len != 0) {
removedStr.append(list.get(0)).append(",");
}
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这压根是个算法题目
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询