描述
据说著名历史学家 Josephus有过以下的故事:Josephus及他的朋友共41人围成一个圆圈,由第1个人开始报数,每数到3该人就必须出去,然后再由下一个人重新报数,直到圆圈上少于3人为止。Josephus 将朋友与自己安排在第16个与第31个位置,成为最后剩下的人。
扩展这个问题,当人数为n,每次报数为k时,求解最后的K-1个剩下的人的位置
输入格式
在同一行内输入两个正整数n和k,要求k > = 2且n >= k
输出格式
以列表形式显示剩余的人的序号(如果k<2 或者n<k,打印"Data Error!")
输入输出示例
| 输入 | 输出 | |
| 示例 1 |
41 3 10 4 |
[16, 31] [1, 5, 6] |
n,k=map(int, input().split())
ls1=[i for i in range(1,n+1)]
if k<2 or n<k:
print("Data Error!")
else:
a=0
while list:
a=a+1
b=ls1.pop(0)
if a==k:
a=0
else:
ls1.append(b)
if len(ls1)==k-1:
print(ls1)
break
本文讨论了著名的历史学家约瑟夫斯如何在41人中通过每数到3就淘汰的规则存活下来,他巧妙地安排自己在第16和第31的位置。这个问题可以扩展为更一般的形式,当人数为n,每数到k时淘汰,求解最后剩下的k-1个人的位置。给出了一种解决方案,并展示了输入输出示例。该问题涉及算法设计和数学策略,是计算机科学中的经典问题。

2732

被折叠的 条评论
为什么被折叠?



