C# 解决约瑟夫环问题

举报
陈言必行 发表于 2021/08/14 01:14:38 2021/08/14
【摘要】 大致题意:10个小孩,每个人都有一个序号(从0-9),他们依次围成一圈,然后从0序号的小孩开始报数,从0-3,数到3的人出局,一直循环,问剩下的人是谁,序号是多少??? 单纯的只使用数组解决,,, using System; namespace 约瑟夫环数组求解 { class Program { static void Main(string[] args)...

大致题意:10个小孩,每个人都有一个序号(从0-9),他们依次围成一圈,然后从0序号的小孩开始报数,从0-3,数到3的人出局,一直循环,问剩下的人是谁,序号是多少???


单纯的只使用数组解决,,,

using System;

namespace 约瑟夫环数组求解
{ class Program { static void Main(string[] args) { YueSeFuHuan(10,4); Console.ReadKey(); } /// <summary> /// 约瑟夫环问题求解方法 /// </summary> /// <param name="sum">总人数</param> /// <param name="num">第几个人出局</param> static void YueSeFuHuan(int sum,int num) { int[] arr = new int[sum]; 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;   //第i个人出局 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); } } } }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62

使用递归解决,,,

假设下标从0开始,0,1,2 .. m-1共m个人,从1开始报数,报到k则此人从环出退出,问最后剩下的一个人的编号是多少?

现在假设m=10

0 1 2 3 4 5 6 7 8 9 k=3

第一个人出列后的序列为:

0 1 3 4 5 6 7 8 9

即:

3 4 5 6 7 8 9 0 1(*)

我们把该式转化为:

0 1 2 3 4 5 6 7 8 (**)

则你会发现: ((*)+3)%10则转化为()式了

也就是说,我们求出9个人中第9次出环的编号,最后进行上面的转换就能得到10个人第10次出环的编号了

设f(m,k,i)为m个人的环,报数为k,第i个人出环的编号,则f(10,3,10)是我们要的结果

当i=1时, f(m,k,i) = (m+k-1)%m

当i!=1时, f(m,k,i)= ( f(m-1,k,i-1)+k )%m


using System;

namespace 约瑟夫环问题递归
{ class Program { class Program { static void Main(string[] args) { Console.WriteLine("请输入数字m,k"); int m = int.Parse(Console.ReadLine()); int k = int.Parse(Console.ReadLine()); for (int i = 1; i <= 10; i++) { Console.WriteLine( "第{0}人出局:",Joseph(m,k,i)+1); } Console.ReadKey(); } /// <summary> /// 约瑟夫环问题 /// </summary> /// <param name="m">总人数</param> /// <param name="k">第几个人出局</param> /// <param name="i">出局的次数</param> /// <returns></returns> public static int YueSeFuHuan(int m, int k, int i) { if (i == 1) { return (m + k - 1) % m; } else { return (YueSeFuHuan(m - 1, k, i - 1) + k) % m; } } }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

文章来源: czhenya.blog.csdn.net,作者:陈言必行,版权归原作者所有,如需转载,请联系作者。

原文链接:czhenya.blog.csdn.net/article/details/78230368

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。