您的位置:首页 > 编程语言 > C#

约瑟夫环问题

2017-06-27 02:24 134 查看
假设又m个人围成一圈,从第n个人开始报数m个,报到m的人出圈,输出每个人的出圈顺序。

class Program
{
static void Main(string[] args)
{
Program p = new Program();
p.Print(9,2,5);
}
//allNum 总人数 startNum 开始数的位置 num 步长
public void Print(int allNum,int startNum,int num)
{
int temp = 0;
//声明一个存放跳出来的人的数组
int[] outPut = new int[allNum];
//声明一个数组存放出圈的人以打印出圈顺序
int[] arr = new int[allNum + 1];
//添加人allNum个
for (int i = 1; i <= allNum; i++)
{
arr[i] = i;
}
//遍历找到出圈的人,并将其放到数组的后边
for (int i = allNum; i > 1; i--)
{
startNum = (startNum + num - 1) % i;
if (startNum == 0)
startNum = allNum;
outPut[temp] = arr[startNum];
temp++;
for (int j = startNum; j < i; j++)
{
arr[j] = arr[j + 1];
}
outPut[temp] = arr[1];
}

for (int i = 0; i < allNum; i++)
{
Console.WriteLine("我是第" + outPut[i] + "个人,我是第" + (i + 1) + "个出圈的");
}
}
}
主要逻辑在于找到出圈的人以及对出圈的人在原数组中的处理。

由于数组不能像List一样随意删除里面的元素,所以将已经出圈的人放到数组的后边,并且下次遍历时数组的长度减1。

outPut[temp] = arr[1];


数组中的第一个人必然是最后一个出圈的,当外层for循环完成时,将最后一个人添加进outPut数组中。

输出结果:



Tip:如果要删除数组中的元素的话,可以将其转换为List,删除元素后在转换成数组

int[] arry = new int[3] { 1,2,3};
ArrayList al = new ArrayList(arr);
al.RemoveAt(1);
arr = (int[])al.ToArray(typeof(int));
Debug.Log(arr.Length);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C#