谁能用C#给我写一个猴王算法:
有n只猴子围成一圈,从第一个开始数,数到第m个将其踢出,接着后面继续从1数,如此循环,直到只剩最后一只z,那只就是猴王.输入n,m.输出z.
有n只猴子围成一圈,从第一个开始数,数到第m个将其踢出,接着后面继续从1数,如此循环,直到只剩最后一只z,那只就是猴王.输入n,m.输出z.
解决方案 »
- C#程序物理内存不大而虚拟内存用过大的问题?
- 请问DotNetBar菜单怎么设置快捷键?
- SQLite文件的打开问题
- 如何将字符串编码成int类型
- 求助 C# 在dataGridView中加ComboBox 并帮定到相应数据库的字段上 源码 ~~~~~~~~~~~~~~~~急!
- 自己建的一个DataTable怎样绑定到DataGrid ?
- DATAGRID模板列中加入IMAGE组件的问题
- tabcontrol控件怎么实现全屏或者随界面变大小啊?
- 如何手动指定datagridview控件中各列的字段
- 做一个类似于access里那个报表编辑系统,难度是不是很大呀,请大家讨论
- C# Winform怎么在窗体显示后执行指定的方法
- 如何改变SharpDevelop中的项目dll默认输出路径
using System.Collections.Generic;
using System.Text; namespace Monkey
{
class Program
{
static void Main(string[] args)
{
int num;
num=Monkey(3, 1, 2);
Console.WriteLine(num);
Console.ReadKey();
} static int Monkey(int sum, int diJiGe, int shuDaoJi)
{
int paiChu=0;
int i =diJiGe - 1;
int k = 0;
int [] myMonkey=new int [sum];
while ((sum - paiChu) != 1)
{
if (myMonkey[i] == 0)
{
k = k + 1;
if (k == shuDaoJi)
{
myMonkey[i] = 1;
k = 0;
paiChu = paiChu + 1;
}
}
i = i + 1;
if (i > (sum - 1))
i = 0;
}
int m=0;
for (int j = 0; j < myMonkey.Length; j++)
{
if (myMonkey[j] == 0)
m = i;
}
return m+1;
}
}
}
public int monkeyKing(int n, int m) //n只猴 ,m个排除。
{
int z=0; //z是王
for (int j = 2; j <= n; j++) z = (z + m) % j;
return ++z;
}
正解啊,简短精悍,我为了验证其正确性,想了不少时间,如果lzsh0622可以说明原理的话,就可以省去其他人去理解的时间了。我来说说我的理解:由于猴子是围成一圈的,所以实际序号是可以无限大的,我们不妨假设当前序号z是前面一次序号减去了m后剩下的序号,如果前面一次序号小于m,只要反复+j(当前面一次有j个猴子时),让序号大于m即可,而最后剩下一个猴子的时候序号肯定为0,返回值是++z正好为1,代表第一个猴子。由此可见,只要每次将当期序号z反过来加上m后,就是前面一次的序号了,除j取余只不过是为了让序号正好在0~(j-1)的范围内而已。
用标准的循环链表解决(约瑟夫环算法) 比较一下,过程差不太多using System;
using System.Collections.Generic;
using System.Text;namespace ExJose{
class ClassJose {
//从第start人开始计数,以alter为单位循环记数出列,总人数为total
public int[] Jose(int total, int start,int alter)
{
int j, k = 0;
//count数组存储按出列顺序的数据,以当结果返回
int[] count = new int[total + 1];
//s数组存储初始数据
int[] s = new int[total + 1];
//对数组s赋初值,第一个人序号为0,第二人为1,依此下去
for (int i = 0; i < total; i++)
{
s[i] = i;
}
//按出列次序依次存于数组count中
for (int i = total; i >= 2; i--)
{
start = (start + alter - 1) % i;
if (start == 0)
start = i;
count[k] = s[start];
k++;
for (j = start + 1; j <= i; j++)
s[j - 1] = s[j];
}
count[k] = s[1];
//结果返回
return count;
} static void Main(string[] args)
{
ClassJose e=new ClassJose ();
int[] a = e.Jose(10,3,4);
for (int i = 0; i < a.Length; i++)
{
Console.WriteLine(a[i].ToString ());
}
}
}
}