假设又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);