[英]Python Prime Number Generator
该代码将每个非质数打印两次,但质数只打印一次。 但是,我只想打印出质数。 我知道质数生成器有更好的解决方案,但我真的很想知道这段代码中的错误在哪里。
prime_numbers = []
def prime_gen(upper_limit):
for i in range(2, upper_limit):
for j in range(2, upper_limit):
if i % j == 0 and i % j != 1 and i % j != j and i:
prime_numbers.append(i)
prime_gen(20)
print(prime_numbers)
您应该将j
停在i
,而不是上限。 寻找比i
大的i
除数没有意义——没有任何除数。 而且i
本身不应该受到测试,因为它总是会自我分裂。
一个数不是质数,因为它可以被另一个整除,而是因为它不能。 所以测试所有可能的除数,只有在最后,如果没有找到,才将i
添加到质数列表中。
prime_numbers = []
def prime_gen(upper_limit):
for i in range(2, upper_limit):
for j in range(2, i): # <== only look for divisors less than i
if i % j == 0: # <== STOP if you found a divisor
break
else: # <== Add only if no divisor was found
prime_numbers.append(i)
prime_gen(20)
print(prime_numbers)
prime_numbers = [2] # we know two is prime
def prime_gen(upper_limit):
# start at 3 and use a step of 2
for i in range(3, upper_limit, 2):
# loop from 2 to i
for j in range(2, i):
# if i was divisible by any j we will break the loop
# as i is not prime
if i % j == 0:
break
else:
# if we get here we completed our inner loop
# which means no i % j was equal to 0
prime_numbers.append(i)
您需要内部循环从 2 到 i,您不想要满足if i % j == 0
数字,因为它们不是素数。 您的 last and i
也将始终为 True,任何不为0
都将为 True,因此测试是多余的。 您也可以从 3 开始并使用 2 的步骤,所有偶数都不能是质数。
您还可以将if/else
替换为any:如果我们发现任何i % j
等于 0,它将懒惰地评估和中断。
prime_numbers = [2]
def prime_gen(upper_limit):
for i in range(3, upper_limit, 2):
if not any(i % j == 0 for j in range(2, i)):
prime_numbers.append(i)
第一个没有优化,而第二个稍微优化。 当然,“埃拉托色尼筛”是最好的。 此函数按顺序生成素数,但没有上限。
简单且未优化:
def simple_prime_list(num):
list_of_prime = (2, )
current_num = 2
is_prime = True
while len(list_of_prime) != num:
current_num += 1
for i in list_of_prime:
if current_num % i == 0:
is_prime = False
if is_prime == True:
list_of_prime += (current_num,)
#To reset the status
is_prime = True
return list_of_prime
通过不检查所有的偶数略优化break
的for循环出来的时候,数量不是素数:
def prime_list(num):
list_of_prime = (2, )
current_num = 2
is_prime = True
while len(list_of_prime) != num:
current_num += 1
if current_num % 2 != 0:
for i in list_of_prime:
if current_num % i == 0:
is_prime = False
break
if is_prime == True:
list_of_prime += (current_num, )
#To reset the status
is_prime = True
return list_of_prime
尝试测量 2 个不同的运行时间:
import time
def measureTime(fn):
start = time.clock()
fn()
end = time.clock()
#return value in millisecond
return (end - start)*1000
print('Simple Prime List:', measureTime(lambda: simple_prime_list(1000)), 'ms')
print('Optimised Prime List:', measureTime(lambda: prime_list(1000)), 'ms')
输出:
简单质数列表:775.798 毫秒
优化的质数列表:69.48299999999996 ms
如果您正在寻找生成器,您应该使用yield而不是return ,这是我对无限素数生成器的回答:
def primes_generator():
n = 1
while True:
for x in range(2, n):
if n % x == 0:
#not prime
break
else:
#prime
yield n #<- yield instead of return to create a generator
n+=1
如果你需要一个上限,你可以像这样使用它:
def primes_generator(upper_limit):
for n in range(2, upper_limit):
for x in range(2, n):
if n % x == 0: break
else:
yield n
那么你可以像这样使用它:
primes = primes_generator()
for prime in primes:
print(i)
简单的python控制台质数生成器
global num,primes
num = 1
primes=[]
gen = raw_input("enter the number of primes to generate: ")
while len(primes)<int(gen)+1:
if num > 0:
for i in range(2, num):
if (num % i) == 0:
num+=1
break
else:
print(primes)
primes.append(num)
num+=1
print "Primes generated : ",len(primes)-1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.