方法一

class Program
{
static void Main(string[] args)
{
Console.Write("输入猴子总数:");
int n = int.Parse(Console.ReadLine());
Console.Write("输入出列猴子的标记:");
int m = int.Parse(Console.ReadLine());
Monkeys mk = new Monkeys(n, m);
Monkeys.GetKint(mk.n,mk.m);
}
}
/// <summary>
/// 猴子结构体
/// </summary>
struct Monkeys
{
public int n;//用于得到输入的猴子总数
public int m;//为每个喊出m的猴子做标记
public Monkeys(int n, int m)
{
this.n = n;
this.m = m;
}
public static void GetKint(int n,int m)
{
int remain = n;//剩下的猴子数量
int index = 0;//每次重组猴子的下标
int count = 0;//计数
int[] monkeys = new int[n];
//填充了n个猴子
Console.Write("猴子数列:");
for (int i = 0; i < n; i++)
{
monkeys[i] = i + 1;
Console.Write(monkeys[i]+" ");
}
Console.WriteLine();
Console.Write("喊" + m + "排除的猴子:");
//循环当剩余的猴子只有一个时退出
while (remain>1)
{
if (index>remain-1) //每次溢出就返回第一个猴子重新数
{
index = 0;
}
count++;
if (count==m)
{
Console.Write(monkeys[index]+" ");
count = 0;
monkeys[index] = n+1; //每次得到出列猴子就给他最大值
Array.Sort(monkeys); //重新排列猴子数组
index--; //重新排列之后相当于后面的数都前进一位,所以下标也对应的减去一位
remain--;
}
index++;
}
Console.WriteLine();
Console.WriteLine("最后的国王是:"+monkeys[0]);
Console.ReadKey();
}
}

 

方法二

namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
King(6, 4);
Console.ReadKey();
}

public static void King(int sum, int num)
{
Monkey[] monkey = new Monkey[sum];
int monkeySum = sum;//猴子总数
int index = 0;//猴子标记
bool isToward = false;//是否继续求模
for (int i = 0; i < sum; i++)//初始化
{
monkey[i].num = i + 1;
monkey[i].isKill = false;
}
while (sum > 1)//猴子数大于1
{
foreach (var temp in monkey)//遍历所有
{
isToward = false;
if (temp.isKill == false)//没淘汰的猴子报数
{
index++;
isToward = true;
}
if (index % num == 0 && isToward)//数到3的猴子淘汰
{

monkey[temp.num - 1].isKill = true;//标记为true
Console.WriteLine("被淘汰的猴子:" + monkey[temp.num - 1].num);
sum--;
}
}
}

foreach (var temp in monkey)//猴子结构体
{
if (temp.isKill == false)
Console.WriteLine(temp.num);
}
}

struct Monkey
{
public int num;
public bool isKill;
}
}
}