问题要求计算第1000个素数。我正在尝试解决此问题,但我被卡住了。
有一些解决问题的准则。
为帮助您入门,以下是您可能应该遵循的阶段的粗略概述 编写代码:
到目前为止,我的尝试是
def calculate_thousandth_prime():
j = 0
for i in range(3,int(10e6)):
if i%2 != 0:
counter = 0
for k in range(1, i):
if i%k != 0:
counter += 1
if counter == 0:
print("This candidate is prime")
j += 1
if j == 1001:
print("The number "+str(i)+" is the thousandth prime")
break
return 0
calculate_thousandth_prime()
我的代码卡在i%k != 0
上。我一定做错了什么...有帮助吗?
答案 0 :(得分:2)
您有两个问题:
首先,您正在搜索for k in range(1, i):
。因为每个数字(包括质数)都可以被1整除,所以您找不到任何质数。尝试改为搜索range(2, i)
。
第二,您正在检查if i%k != 0:
。您应该改为检查i%k == 0
。如果i
可被任何数字k
整除,则该数字为 not 质数。
实际上,我发现了第三个问题:您有一个错误的错误。通过初始化j=0
,您的代码会将其发现的第一个素数视为“零”素数。该代码将输出千位素数而不是千分之一素。
答案 1 :(得分:1)
我所做的更改:
2
步骤以更自然地跳过偶数。range(2, i//2)
。除以大于i//2
的值将小于2。def calculate_thousandth_prime():
prime_counter = 0
for i in range(3,int(10e6),2):
prime = True
for k in range(2, i//2):
if i % k == 0:
prime = False
break
if prime:
print(str(i) + " is prime")
prime_counter += 1
if prime_counter == 1000:
print("The number "+str(i)+" is the thousandth prime")
break
return i
calculate_thousandth_prime()
答案 2 :(得分:0)
Eratosthenes的筛网通常是早期素数的最快方法。您可以对其进行调整以达到第n个素数。
例如:
def nthPrime(N):
sieve = [1]*(N**2)
p = 2
for _ in range(N):
while not sieve[p]: p += 1
sieve[p::p] = [0]*len(sieve[p::p])
return p
nthPrime(100) # 541
素数列表除数检查方法可能更容易编写和理解,但速度慢得多(尽管对于仅1000个素数,这没有多大区别):
def nthPrime(N):
primes = [2]
p = 1
while len(primes)<N:
p += 2
primes += [p]*all(p%d for d in primes)
return p