为什么这不适用于欧拉问题:https://projecteuler.net/problem=7
def primeornot(n):
counter=0
if n==2:
return True
else:
for number in range(2,n):
if not n%number:
counter=1
if counter ==1:
return False
if counter==0:
return True
primes=[]
m=2
while len(primes)<10002:
if primeornot(m) is True:
primes.append(m)
m=m+1
else:
m=m+1
print (primes[10000])
[没有语法错误]我编辑了它 Primeornot看起来很好。
答案 0 :(得分:1)
这个无法解决的最大问题是你的while循环中的条件。在找到100个素数之后你就会崩溃,但是你需要找到第1000个素数。
所以这一行:
while len(primes) < 100:
表示每当找到100个素数时,您将退出while循环。如果你需要,我会澄清更多;请告诉我。
答案 1 :(得分:0)
让我们为您的代码添加一个进度条,这样我们就能看到答案的速度有多快。
import progressbar
p = progressbar.ProgressBar(widgets=[progressbar.SimpleProgress(), ' ', progressbar.ETA()], maxval=10002)
p.start()
while len(primes) < 10002:
p.update(len(primes))
if primeornot(m) is True:
primes.append(m)
m=m+1
else:
m=m+1
通过这样做,我们可以看到您当前的实施只是太慢来解决此问题。您需要更好的算法。一般来说,我建议实施类似Sieve of Eratosthenes的内容。
另一方面,也许我们可以对您的程序进行较小的调整以解决问题。我们来看看您的primeornot()
功能。
一旦我们找到了数字的实际除数,我们就不需要测试剩余的可用数字。相反,我们可以提前返回。所以我们可以这样做:
def primeornot(n):
for number in xrange(2,n):
if n % number == 0:
return False
return True
此外,我们知道数字的最大可能除数是square root of that number。所以我们也可以添加优化:
def primeornot(n):
maximum = int(math.sqrt(n)) + 1
for number in xrange(2, maximum):
if n % number == 0:
return False
return True
这会导致代码在不到一秒的时间内运行,并产生正确的答案。