约瑟夫环问题
类型:列表元组
描述
据说著名历史学家 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]
参考代码
这里的处理比较神奇,可以仔细想想。
def Josephus(n,k):
ls_n = list(range(1,n+1))
while len(ls_n) > k-1:
ls_n = ls_n[k:] + ls_n[:k-1]
return ls_n
n,k = map(int,input().split())
if k >= 2 and n >= k:
print(Josephus(n,k))
else:
print('Data Error!')