0
点赞
收藏
分享

微信扫一扫

python学习——如何求质数/素数

千行 2022-01-27 阅读 178

质数判断

方法一

一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除(2, 3, 5, 7等),换句话说就是该数除了1和它本身以外不再有其他的因数。
也就是说,从2到n-1遍历,如果存在一个数是这个整数n的因数,那么它就不是质数。
但是这样做,时间复杂度会很高,当输入的整数比较大的时候,需要花费很长的时间。

n = int(input('输入一个整数:'))
if n>1:
    for i in range(2,n):
        if n%i==0:
            print(n,"不是质数")
            break
    else:
        print(n,"是质数")
else:
    print("1不是质数")

方法二

将方法一中的遍历范围缩小到[2,整数n的平方根],即开根号法:

假如一个数N是合数,它有一个约数a,那么有a×b=N
则a、b两个数中必有一个大于或等于根号N,一个小于或等于根号N。

因此,只要小于或等于根号N的数(1除外)不能整除N,则N一定是素数。

import math
n = int(input('输入一个整数:'))
if n>1:
    for i in range(2,math.floor(n**0.5)+1):
        if n%i==0:
            print(n,"不是质数")
            break
    else:
        print(n,"是质数")
else:
    print("1不是质数")

注意:这里用math.floor(n**0.5)+1,保证能够取到平方根。
不能用math.ceil(n**0.5)

方法三

质数表法。

在方法二的基础上进一步缩小遍历范围。
方法二的遍历范围是从2到平方根。实际上,当我们确定n不能被2整除时,就不需要考虑4、6、8等情况了。也就是说,只需要考虑从0到平方根范围内的质数是不是整数n的因数

这里用递归的方式实现取质数表。

n = int(input('输入一个整数:'))

# 生成从2直到x的质数表
def PrimeList(x,old_list):
    if x>1:
        for i in old_list:
            if n%i==0:
                break
        else:
            old_list.append(x)

P_list = [2,3,5,7] #已知的质数表

if n==2 or n==3 or n==5 or n==7:
    print(n,"是一个质数")
else:
    k = int(n**0.5)
    for i in range(2,k+1):
        PrimeList(i,P_list)
    for i in P_list:
        if n%i==0:
            print(n,"不是一个质数")
            break
    else:
        print(n,"是一个质数")
    print(P_list)
举报

相关推荐

0 条评论