无我

在小学尝试以Python为载体培养学生计算思维

用顺推法解决约瑟夫环问题

约瑟夫环是一个古老的问题,它起源于一个犹太故事。据说,古代著名历史学家Josephus(约瑟夫)经历过以下故事:在罗马人占领乔塔帕特后,39个犹太人和Josephus及他的朋友躲在一个山洞中。39个犹太人决定宁死也不被敌人抓到,于是决定集体自杀。大家经过讨论决定了一种自杀方式,41个人围成一个圆圈,由第1个人开始报数,每报数到3的人就必须自杀,然后再由下一个人重新开始报数,直到所有人都自杀为止。

然而,约瑟夫和他的朋友并不想遵从,Josephus要他的朋友先假装同意该方案,然后将他朋友和自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。


请你编写一个程序解决约瑟夫环问题。要求如下:

输入两个整数m和n,m代表总人数,n代表数到数字几被杀。(m > n)

输出能够活下来的位置编号,用空格隔开。


算法思路:

1、首先输入两个数,一个代表人数,一个代表死亡号码。

2、创建一个长度为人数的列表,默认所有元素的值为0,代表人活着。创建两个变量,一个用来存储当前索引,一个用来存储当前所报号码,当前索引初始值为0,当前报号初始值为1。

3、只需要通过循环结构进行模拟顺推,当活着的人数<死亡号码的时候结束循环并显示活下来的号码。顺推的过程中可能发生3种情况:

  • 如果当前索引的人已经死亡,只需要将当前索引+1,无需其他操作。

  • 否则,如果当前索引的人没有报道死亡号码,只需要将当前索引+1和当前报号+1

  • 最后一种情况就是报到了死亡号码。这个时候需要将当前元素的值改为1,代表人已死亡,同时将人数-1。还要将当前索引+1并将当前报号重新恢复为1。

4、每一次循环的开始要注意判断一下当前索引是否超出了人数最大值,如果超出说明一圈的报号完毕,这时要将索引重新设置为0继续进行循环。

5、循环结束后,找出列表中值仍然为0的元素,显示出人的编号即可。


算法实现:



程序运行结果:




评论 ( 3 )
热度 ( 2 )
只展示最近三个月数据

© 无我 | Powered by LOFTER