约瑟夫环问题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值