Euler项目,#7 Python

2024-09-28 21:23:18 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我想找出第10001个质数。这是我的密码-

counter = 3
primes = [1]

while len(primes) < 10002:
    for i in range(2, counter):
        if counter % i == 0:
            counter += 1
    else:
        primes.append(counter)
        counter += 1

print counter

所以我得到的素数输出是一个数字列表,前几个数字是1,3,5,7,11。。。到目前为止,很好。。。13,17,19,23,27。。。等等,27岁?所以在这一点上,它崩溃了,开始返回大部分素数,但不是所有的素数。这需要永远。在

我是编程新手,通过了codeaccademy的Python课程,现在我想知道如何克服基本上只是语法入门的问题。我不是数学出身,所以虽然我知道质数是什么,但我知道有更好的方法来解决这个问题。如果有人在类似的船上想“合作”,一起学习Py2.7,我非常乐意。在


Tags: in密码forlenifcounterrange数字
3条回答

由于您正在做一个ProjectEuler难题,显然您需要对代码进行注释,而不是解决方案。在

您的代码:

counter = 3
primes = [1]

while len(primes) < 10002:
    for i in range(2, counter):
        if counter % i == 0:
            counter += 1
    else: # Mis-aligned else (assuming it's intended for the if)
        primes.append(counter)
        counter += 1

print counter
  1. 您的elseif不一致
  2. 您的for循环一直到counter,根据自身测试可除性一定会找到余数0。在
  3. 您的else子句将为counter的每个非因子命中。大多数数字不是一个因素,所以你不想在这种情况下采取行动。而是在if部分触发时跳出循环。在
  4. 在退出for循环之后,您需要检查是否找到了一个因子,如果没有,请将counter添加到素数列表中。在

看起来你正在尝试实现一个天真的未优化的暴力搜索,这很好。在

在编码之前,可以尝试用文字或伪代码写出算法。在

作为一个练习,我将编写一行复杂的代码,并给出类似问题的解决方案,而不是为您编写简单的一步一步的代码。在

作为理解python的练习,尝试弄清楚这一行中发生了什么。 这段代码将找到直到n个数的素数,而不是您想要的前n个素数

def primes(n):
   return sorted(set(range(2, n+1)) - set([p*i for p in range(2, n+1) for i in range(p, n+1)]))

我不会为您实现任何东西,因为这就是您使用ProjectEuler的原因,但是我将强烈地指向The Sieve of Eratosthenes的方向。它将在几秒钟内计算出你的代码在几小时内会做什么。在

它是这样工作的:(在伪代码中)

for known_prime in a huge list of numbers:
    k=2
    while known_prime*k < the biggest number:
        known_prime*k is not prime
        k += 1

一旦你通过列表的sqrt,你就找到了列表中的每个质数。在

相关问题 更多 >