Euler Project,#7 - Python

时间:2014-01-23 23:52:51

标签: python python-2.7

所以我试图找到第10,001个素数#。这是我的代码 -

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?所以在这一点上它崩溃并开始返回大多数素数而不是所有素数。这需要永远。

我是编程新手,通过CodeAcademy的Python课程,现在试图弄清楚如何通过基本上只是对语法的介绍。我不是来自数学背景,所以虽然我知道什么是素数,但我知道有更好的方法来解决这个问题。如果有类似船只中的任何人想要“合作”并共同学习Py2.7,我会非常高兴。

6 个答案:

答案 0 :(得分:5)

我不会为你实现任何东西,因为这就是你做Project Euler的原因,但我会强烈指出你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,你已经找到了列表中的每个素数。

答案 1 :(得分:0)

由于您正在进行项目Euler拼图,您显然需要对代码而不是解决方案进行评论。

您的代码:

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. 不符
  3. 你的for循环一直到counter,测试对自身的可分性必然会找到余数为0.
  4. 您的else子句将针对counter的每个非因子点击。大多数数字都不是一个因素,所以你不想在这种情况下采取行动。而是在if部分触发时跳出循环。
  5. 退出for循环后,您需要检查是否找到了某个因子,如果没有,请将counter添加到素数列表中。
  6. 看起来你正在尝试实施一个天真的未经优化的暴力搜索,这很好。

    也许在编码之前尝试用文字或伪代码写出算法。

答案 2 :(得分:0)

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

尝试弄清楚这一行中的内容,作为理解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)]))

答案 3 :(得分:0)

如果您想编写一个高效且智能的代码,您可以使用Sieve of Eratosthenes,这是一种在给定范围内查找素数的好算法。 有关更多信息,请阅读: http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

答案 4 :(得分:0)

import time
start_time = time.time()

def is_prime(limit):
    aval = True
    for j in range(2,int(limit**0.5)+1):
        if limit == 2:
            aval = True
            break
        elif limit % j == 0:
            aval = False
            break
    return aval
counter = 0
for i in range(2,1000000):
    if is_prime(i):
        counter += 1
        if counter == 10001:
            print("the 10001th prime number is: ",i)
            break

print("seconds: ", time.time() - start_time)

答案 5 :(得分:0)

这是我解决这个问题的方法。可能没有那么快,但并非完全针对问题7。

import time
start = time.time()

n = int(input('Please enter a number: '))
def nth_prime(n):
    primes = [2]
    x = 3
    max_amount = int(input('How much would you like to go for?: '))
    while True:
        try:
            while x < max_amount:
                for i in primes:
                    if x % i == 0:
                        break
                else:
                    primes.append(x)
                x += 2
            print(primes[n])
        except IndexError:
            max_amount = int(input("Please enter a greater number: "))
            continue
        else:
            print(f('Good job. You\'ve found the {n+1}st prime number :) ')
            break
nth_prime(n)

end = time.time()
print(str(float(end - start)) + " seconds")