欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

约瑟夫环问题

程序员文章站 2024-03-16 22:53:10
...

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Test1
{
    class Program
    {

        static void Main(string[] args)
        {


            #region
            //20个小孩,每个人都有一个序号(从0-9),他们依次围成一圈,然后从0序号的小孩开始报数,
            //数到7的人出局,一直循环,问剩下的人是谁,序号是多少???
            YueSeFuHuanTest(30, 8);

            #endregion
        }

        /// <summary>
        /// 解决约瑟夫环
        /// </summary>
        /// <param name="sum">总人数</param>
        /// <param name="num">第几个人出局</param>
        public static void YueSeFuHuanTest(int sum, int num)
        {
            int[] arr = new int[sum];
            //全部赋值为1(作为标识符)
            for (int i = 0; i < sum; i++)
            {
                arr[i] = 1;
            }

            int count = 0;  //计数器
            int arrlength = arr.Length; //剩余人数
            //当玩家数量多余一个时,进行循环
            while (arrlength > 1)
            {
                for (int i = 0; i < arr.Length; i++)
                {
                    if (arr[i] == 1)
                    {
                        //只记录标识符唯一
                        count++;
                        if (count == num)
                        {
                            arr[i] = 0;
                            arrlength--;
                            count = 0;
                            Console.WriteLine("第{0}个人出局,编号是{1}", i + 1, i);
                        }
                    }
                }
            }

            //打印最后的人
            for (int i = 0; i < arr.Length; i++)
            {
                if (arr[i] == 1)
                {
                    Console.WriteLine("第{0}个人留下,编号是{1}", i + 1, i);
                }
            }


        }

 

相关标签: C# 算法