方法一:模拟约瑟夫环过程

n, k = map(int, input().split()) if k < 2 or n < k: print("Data Error!") else: # 初始化列表,第i个位置为1表示第i个人还在游戏中,为0表示已经出局 players = [1] * n # idx表示当前游戏中最后一个人的位置 idx = -1 # 记录出局的人的个数 out_cnt = 0 # 循环报数直到只剩下k-1个人 while out_cnt < n - k + 1: # 报数 for i in range(k): idx = (idx + 1) % n # 如果这个人已经出局,需要继续报数 while players[idx] == 0: idx = (idx + 1) % n # 标记出局的人 players[idx] = 0 out_cnt += 1 # 输出剩余的人的位置 res = [i+1 for i in range(n) if players[i]] print(res)

方法二:利用递推公式求解

n, k = map(int, input().split()) if k < 2 or n < k: print("Data Error!") else: # f表示n个人报数为k时,最后剩下的人的位置 f = [0] * (n+1) f[1] = 1 for i in range(2, n+1): f[i] = (f[i-1] + k - 1) % i + 1 # 根据f数组求解最后剩下的k-1个人的位置 res = [] last = n for i in range(k-1): res.append(f[last]-1) last = f[last] - 1 print(res


原文地址: http://www.cveoy.top/t/topic/g0VV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录