C#两种结构实现的约瑟夫问题

问题概述:约瑟夫问题: n 猴子(元素)围成圈,依次从1开始报数,报到3的退出,下一位接着从1开始报数,... 如此下去直到最后圈中剩下唯一的一个猴子为大王

1、采用数组,报3的设置为defalt,最后检测不是defalt的返回

2、采用LIST结构,直接删除最后只剩下一个

开始遇到了一些问题,后来发现只要采用一个可以不停循环的指针来指向数值,在用一个cnt外挂计数,还是很好完成的。

只是平常的作业,不是很完善,留着参考。

        private T JOS<T>(T[] arr)
        {
            
            dynamic test_defalt = default(T);
            T joker = test_defalt;
            int cnt = 0;
            int left = 0;
            
            if (arr.Length != 0 && arr != null)//排除1\2
            {
                
                for (int i = 0; i < arr.Length; i++)//排除3
                {
                    
                    dynamic t1 = arr[i];
                    if (t1 == test_defalt)
                    {
                        
                        return test_defalt;
                    }
                   
                }


                left = arr.Length;
                //Console.WriteLine(left);
                int j = 0;
                while (left > 1)
                {
                    
                    
                    if (arr[j] != test_defalt)
                    {
                        cnt++;
                        if (cnt % 3 == 0)
                        {
                            arr[j] = test_defalt;
                            left--;
                        }
                    }
                    j++;
                    if (j % arr.Length == 0)
                    {
                        j = 0;
                    }
                }
                for (int i = 0; i < arr.Length; i++)
                {
                    if (arr[i] != test_defalt)
                    {
                        
                        //Console.WriteLine(arr[i]);
                        return arr[i];
                    }
                }

            }
            else
            {
                return joker;
            }
            return joker;

            
        }

 private T JOS<T> (List<T> ts) 
        {
            T joker = ts[0];
            int left = ts.Count;
            int cnt = 0;
            int index = 0;
            while (left > 1)
            {
                cnt++;
                
                if (cnt % 3 == 0)
                {
                    ts.RemoveAt(index);
                    
                    left--;
                    index--;
                }
                index++;
                if (index%ts.Count==0)
                {
                    index = 0;
                }
                
                

            }
            return ts.First();
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值