Python Prime数字生成器

时间:2015-05-09 18:35:23

标签: python

代码打印每个非素数两次,但素数只打印一次。 但是,我只想打印出素数。 我知道对于素数生成器有更好的解决方案,但我真的想知道这段代码中的错误在哪里。

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)

4 个答案:

答案 0 :(得分:1)

您应该j停在i,而不是上限。没有必要寻找大于i的{​​{1}}的除数 - 没有任何除数。并且i本身不应该被测试,因为它总是分开。

并且一个数字不是素数,因为它可以被另一个整除,但因为它不是。因此,测试所有可能的除数,并且仅在最后,如果没有找到,则只将i添加到素数列表中。

i

答案 1 :(得分:0)

第一个未优化,而第二个稍微优化。当然,“Sieve of Eratosthenes”是最好的。此函数按顺序生成素数,但没有上限。

简单而未优化:

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

当数字不是素数时,通过不检查for循环中的所有偶数和break进行略微优化:

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 ms

     

优化Prime列表:69.48299999999996 ms

答案 2 :(得分:0)

如果您正在寻找生成器,则应使用 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)

答案 3 :(得分:0)

简单的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