【发布时间】:2020-11-26 19:10:17
【问题描述】:
对于 323,以下代码应该返回 False,它不是素数。
import math as m
def isprime(a):
if a < 2 or a != 2 and a % 2 == 0 or str(a)[-1] == "5" and a != 5 or sum([int(i) for i in list(str(a))]) % 3 == 0 and a != 3:
return(False)
elif a == 2:
return(True)
else:
for divisor in range(3, m.floor(m.sqrt(a))):
if a % divisor == 0:
return(False)
return(True) # So far, fails ONLY for 323!
print(isprime(323)) # prints "True" when this should not be!
但是,它返回 True。
【问题讨论】:
-
在 Python 中
range()不包括最后一个值。m.floor(m.sqrt(a))是 17,而a是 323。所以你的范围变成了range(3, 17),这意味着你永远不会检查 17 作为除数。您可以将m.ceil()的使用范围加1,而不是floor()。 -
你能清理一下第一个 if 语句吗?有点难读。要开始 Id 添加一个独立的 if a
-
更一般地说,您的方法编码好的规则,但有一种更有效的方法。 en.m.wikipedia.org/wiki/Sieve_of_Eratosthenes
-
在边缘情况下使用 ceil 而不是将底值加 1 失败。到目前为止,后者已经勾选了所有选项!
-
虽然我同意埃拉托色尼筛法是一种更好的方法,但要找到一线希望,我认为我的努力是值得的!谢谢夸奖!
标签: python algorithm logic primes