所以我试图找到第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,我会非常高兴。
答案 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
else
与if
for
循环一直到counter
,测试对自身的可分性必然会找到余数为0. else
子句将针对counter
的每个非因子点击。大多数数字都不是一个因素,所以你不想在这种情况下采取行动。而是在if
部分触发时跳出循环。counter
添加到素数列表中。看起来你正在尝试实施一个天真的未经优化的暴力搜索,这很好。
也许在编码之前尝试用文字或伪代码写出算法。
答案 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")