Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Project Euler#7 Python错误输出_Python - Fatal编程技术网

Project Euler#7 Python错误输出

Project Euler#7 Python错误输出,python,Python,我用Python编写了下面的代码,我想找到第10001个素数。我得到的答案是103903,但正确答案是104743。我做错了什么 def primes(n): primes = [2] i = 3 while len (primes) < n: if isprime(i): primes.append(i) i = i + 1 return primes [-1] def isprime(n):

我用Python编写了下面的代码,我想找到第10001个素数。我得到的答案是103903,但正确答案是104743。我做错了什么

def primes(n):

    primes = [2]
    i = 3

    while len (primes) < n:
        if isprime(i):
            primes.append(i)
        i = i + 1

    return primes [-1]

def isprime(n):
    i = 2
    if ((i ** n) - i) % n == 0:
        return True
    else:
        return False
def素数(n):
素数=[2]
i=3
而len(素数)
您的
iPrime
功能不正确。虽然它确实适用于许多情况,并且确实可以为300左右的所有数字生成正确的结果,但它仍然只是一种启发式方法。看起来你从中得到了这个函数,但是注意,定理说,如果p是素数,那么这对所有的数字a都成立,所以你不能只检查它对a=2是否成立,然后确定p是素数

从费马素性测试的维基百科页面:

给定一个整数n,选择某个整数a互质到n,然后计算a^(n-1)%n。如果结果与1不同,则n是复合的。如果它是1,那么n可能是素数


对于一个合适的
isprime
函数,没有办法用所有潜在的除数进行试除。如果这对于Project Euler问题来说太慢,那么您可以优化一些事情,例如,仅测试小于等于
sqrt(n)
的除数,并且仅当这些除数之前被确定为素数时。

显示
isprime
函数。另外,不需要存储所有的素数,只需记住最后一个。您的代码是不可复制的。请确保其他人能够运行它。此外,像“我做错了什么”这样的问题通常不会得到好的答案。尽量说得更具体些。你试过什么?你期望的结果是什么,等等?我更新了我的帖子,你可以看到iPrime的功能@托比亚斯·库姆。。。你从哪里得到的
isprime
函数?那是不对的。这似乎只是一个启发式测试,也就是说,它在某些情况下有效,甚至在大多数情况下有效,但并不总是有效。我在维基百科@tobias_kYes上使用了Fermat的小定理。你是对的,我改变了我的素性测试,我使用了一个计数器而不是保留列表,它工作正常。@BahadirBozatli事实上,保留列表。您可以使用列表中已识别的素数来加速
isprime
检查。