
为了解决这个问题,我们需要模拟一个游戏过程,其中每一轮游戏会根据当前轮次计算每位同学编号的各位数字的次方和,并将这些次方和作为淘汰的依据。经过指定轮次后,剩下的同学即为获胜者。
方法思路
- 输入处理:读取游戏轮次和初始编号列表。
- 逐轮处理:对于每一轮,计算当前所有存活同学编号的各位数字的次方和,并根据这些和淘汰对应的同学。
- 次方计算:根据当前轮次确定次方数,例如第一轮是平方(次方数为2),第二轮是立方(次方数为3),依此类推。
- 淘汰机制:每一轮计算完所有次方和后,检查当前存活同学的编号是否在这些次方和中,若存在则淘汰。
- 结果输出:经过所有轮次后,将剩下的同学编号按升序排列输出。
解决代码
n = int(input())
survivors = list(map(int, input().split()))
for i in range(n):
exponent = i + 2
current_sums = set()
for num in survivors:
s = sum(int(digit) ** exponent for digit in str(num))
current_sums.add(s)
survivors = [num for num in survivors if num not in current_sums]
survivors.sort()
print(' '.join(map(str, survivors)))
代码解释
- 输入处理:读取输入的轮次数和初始编号列表。
- 逐轮处理:使用循环处理每一轮游戏,计算当前存活同学的次方和。
- 次方和计算:将每个编号的各位数字转换为整数,计算其对应的次方和,并存入集合
current_sums
。 - 淘汰机制:筛选出不在次方和集合中的编号作为下一轮的存活同学。
- 结果输出:将最终存活的编号排序后输出。