我的euler 7代码出了什么问题?

时间:2014-03-29 03:35:55

标签: python

为什么这不适用于欧拉问题: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看起来很好。

2 个答案:

答案 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

这会导致代码在不到一秒的时间内运行,并产生正确的答案。