我已经开始学习python,做了一些基本的工作之后,我开始做欧拉问题。我能够做到7,但编译需要很长时间。有人可以帮我吗?
这是我编写的唯一代码
def prime(n):
count = 0
if n <= 1:
print("Number is neither prime nor composite")
if n == 2:
print("Number is prime")
if n > 2:
for i in range(2, n//2 + 1):
if n % i == 0:
count += 1
else:
count += 0
if count == 0:
return True
else:
return False
b = 10001
a = []
i = 2
while len(a) < b:
if prime(i):
a.append(i)
i += 1
else:
i += 1
print(a[-1])
答案 0 :(得分:1)
无需查找数字的所有因素。找到因子后,数字显然不是质数,您可以立即返回False
。
编辑:
正如Federico Domeniconi在评论中提到的那样,也无需迭代n
的一半。迭代到其平方根就足够了:
if n > 2:
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0:
return False
# No factors found, n is a prime:
return True
答案 1 :(得分:0)
如果您真的想把这种解决方案归结为:
def is_prime(n):
factors = range(2, int(math.sqrt(n)) + 1)
return (n > 1 and all(n % f for f in factors))
一个我可能曾经知道却忘记了的意外琐事。为什么函数为True
返回n = 2
?
factors # range(2, 1 + 1)
# range(2, 2)
# Which is an empty range.
# Or in more concrete form: an empty list.
n > 1 # True
all([]) # Hmmmmm?
#
# Are all of the items in an empty collection true?
#
# If every tree falls in the forest at once, but no one hears them,
# does it make a sonic boom?
#
# Contrary to Billy Preston -- and microeconomists world wide --
# can you really get something from nothing?
#
# Python says YES. I'm sure smart mathematics do too, but
# I would be curious to hear the reasoning.
我想我的问题中有Stack answer。逻辑学家对此有一个name:“ 虚假事实是断言空集合的所有成员都具有特定属性的声明。”
答案 2 :(得分:0)
如果您正在解决欧拉计划中的问题,那么最好拥有自己的Sieve of Eratosthenes。这样可以快速计算素数非常,比您当前使用的方法分解试验快得多。您会发现它对于他们的许多问题很有用。
欧拉7的解决方案变为:
使用Prime Number Theorem估算第10,001个素数的大小。
运行Eratosthenes筛至第1步的极限,为安全起见要超出极限。
对筛子的输出进行计数以找到第10,001个素数。