素数小于501

时间:2019-03-20 11:36:12

标签: python python-3.x math primes

我正在尝试查找所有大于2且小于501的质数。请参阅下面的代码:

num = 501

x = int(input('Enter a number greater than 1: '))

if x > 1:
    for i in range(2, num):
        if x % i == 0:
            result = False
    else:
        result = True

    if result == True:
        print('Prime number.')
    else:
        print('Not a prime number.')
else:
    print('Not a prime number.')

我尝试对两个数字分别为19和99的代码运行。当我在下面给出的代码后放置“ break语句”时,得到的结果为“ 99:不是素数”,而是“ 19,即一个素印为非素”,反之亦然。

if x % i == 0:
        result = False
        break

请更正上面的代码以打印正确的输出。

4 个答案:

答案 0 :(得分:0)

如果我没记错的话,对于501以下的所有数字,它总是返回false,因为任何输入的数字都可以被自己整除。 您还应该检查x!= i。

答案 1 :(得分:0)

这将起作用:

import math   # This will import math module

def isprime(x):
    if x > 1:
        result = True
        for i in range(2, int(math.sqrt(x))+1 ):
            if ( x % i == 0):
                result = False
                break
        if ( result == True):
            print("Prime Number ")
        else:
            print("Not a Prime Number")

并执行如下函数调用:

 isprime(19)

答案 2 :(得分:0)

使用两千多年前的希腊数学家发明的Eratosthenes筛子比使用试验除法要快得多:

def primes(n): # sieve of eratosthenes
    i, p, ps, m = 0, 3, [2], n // 2
    sieve = [True] * m
    while p <= n:
        if sieve[i]:
            ps.append(p)
            for j in range((p*p-3)/2, m, p):
                sieve[j] = False
        i, p = i+1, p+2
    return ps

此函数返回一个小于 n 的质数列表,仅对奇数进行筛选,并分别处理2。如果您希望生成素数而不是返回列表,请使用以下命令:

def primegen(start=0): # stackoverflow.com/a/20660551
    if start <= 2: yield 2    # prime (!) the pump
    if start <= 3: yield 3    # prime (!) the pump
    ps = primegen()           # sieving primes
    p = next(ps) and next(ps) # first sieving prime
    q = p * p; D = {}         # initialization
    def add(m, s):            # insert multiple/stride
        while m in D: m += s  #   find unused multiple
        D[m] = s              #   save multiple/stride
    while q <= start:         # initialize multiples
        x = (start // p) * p  #   first multiple of p
        if x < start: x += p  #   must be >= start
        if x % 2 == 0: x += p #   ... and must be odd
        add(x, p+p)           #   insert in sieve
        p = next(ps)          #   next sieving prime
        q = p * p             #   ... and its square
    c = max(start-2, 3)       # first prime candidate
    if c % 2 == 0: c += 1     # candidate must be odd
    while True:               # infinite list
        c += 2                #   next odd candidate
        if c in D:            #   c is composite
            s = D.pop(c)      #     fetch stride
            add(c+s, s)       #     add next multiple
        elif c < q: yield c   #   c is prime; yield it
        else: # (c == q)      #   add p to sieve
            add(c+p+p, p+p)   #     insert in sieve
            p = next(ps)      #     next sieving prime
            q = p * p         #     ... and its square

my blog上的素数更多。

答案 3 :(得分:0)

  

请更正上面的代码以打印正确的输出。

我相信以下是您代码的简化版本和更正版本:

number = int(input('Enter a number greater than 1: '))

if number > 1:
    for divisor in range(2, int(number ** 0.5) + 1):
        if number % divisor == 0:
            print('Not a prime number.')
            break
    else:  # no break
        print('Prime number.')
else:
    print('Not a prime number.')

此代码有效,但不是最佳的。一种简单的优化方法是将2 /偶数作为特殊情况处理,并且仅将3以后的奇数除以。一个重要的优化方法是按照@ user448810的建议切换到筛分方法。

您提供的代码每个用户输入仅测试一个数字。如果您要将其转换为测试数字范围的循环,例如说所有大于2但小于501的数字,则可以执行以下操作:

for number in range(3, 501):

    if number > 1:
        for divisor in range(2, int(number ** 0.5) + 1):
            if number % divisor == 0:
                print(number, 'is not a prime number.')
                break
        else:  # no break
            print(number, 'is a prime number.')
    else:
        print(number, 'is not a prime number.')