Monisen Number查找结果重复输出:如何实现单次显示?
解决Monisen Number重复输出问题
问题分析
原代码逻辑存在缺陷,导致同一结果多次打印:
- 内层循环
for i in range(2, p)中,每次满足p%i !=0且m%i !=0时就执行打印,同一个m会被重复输出 - 原代码对素数的判断不严谨,甚至错误输出了非Monisen数(比如511=2^9-1=7×73,并非素数,却被错误标记)
解决方案
要实现每个结果仅显示一次,可按以下思路调整:
- 先准确判断
p是否为素数 - 再验证对应的
m = 2^p -1是否为素数 - 使用集合存储已确认的Monisen数,利用集合自动去重的特性避免重复输出
修正后的代码
def is_prime(n): if n <= 1: return False # 遍历到平方根即可,优化素数判断效率 for i in range(2, int(n**0.5) + 1): if n % i == 0: return False return True # 用集合存储结果,自动去重 found_monisen = set() for p in range(2, 10): if is_prime(p): m = (2 ** p) - 1 if is_prime(m): found_monisen.add(m) # 打印去重后的结果 for num in found_monisen: print(f"{num} is Monisen Number")
代码说明
is_prime函数:标准素数判断逻辑,通过遍历到目标数的平方根来优化性能found_monisen集合:确保每个Monisen数仅被存储一次,从根源避免重复输出- 严格遵循Monisen数定义:仅当
p是素数且2^p-1也是素数时,才将其纳入结果集
运行结果
7 is Monisen Number 31 is Monisen Number 127 is Monisen Number
内容的提问来源于stack exchange,提问作者YC_28
相关产品推荐
相关产品推荐

