教你如何用python实现求所有素数

首先,明确目标:我们要求所有素数,所以我们确定素数的标准:

只有1和它本身是因数,也就是只有两个因数。所以我们只要判断一个数的因数是否小于两个就可以了。我们写一个求一个数因数的代码。

def factor(x):
    result = []
    for i in range(1, x + 1):      # 遍历从1到x的所有数
        if x % i == 0:             # 是否除尽
            result.append(i)
    return result

他返回的值是一个列表,如输入4210,返回[1, 2, 5, 10, 421, 842, 2105, 4210]这样我们就能知道一个数有几个因数了,就可以求出一个数是否为素数了。

def IfPrimeNumber(x):
    factor_list_long = len(factor(x))   # 获取输入值的因数个数
    if factor_list_long == 2:           # 是二就是素数
        return True
    elif factor_list_long > 2:          # 这里用elif是因为有1这个特例
        return False

整个代码也就能拼凑出来了。注意,这里的文件保存在D:/PrimeNumber.txt

n = 0


def factor(x):
    result = []
    for i in range(1, x + 1):      # 遍历从1到x的所有数
        if x % i == 0:             # 是否除尽
            result.append(i)
    return result


def IfPrimeNumber(x):
    factor_list_long = len(factor(x))   # 获取输入值的因数个数
    if factor_list_long == 2:           # 是二就是素数
        return True
    elif factor_list_long > 2:          # 这里用elif是因为有1这个特例
        return False


while True:
    n += 1
    if IfPrimeNumber(n):
        with open("D:/PrimeNumber.txt", "a") as f:
            f.write("{0}\n".format(n))  # 不要问我为什么要加\n,问就是因为有亿点怪
            print(f)                    # 不加可能速度更快,但加了效果更好

运行一下就知道,效果不那么好,这显然不是我想要的。所以,改亿下,只求一个数能否被所有素数整除就可以了。

最终源代码(知道你们要拷)就出现了。

x = 1
N = [2]                                       # 一个素数列表

with open("D:/PrimeNumber.txt", "w") as f:    # 2是个特殊的素数
    f.write("2\n")


def IfPrimeNumber(number):
    n = number / 2
    for i in N:
        if i <= n:                            # 因为大于他一半的数,已经不可能被整除了,所以加上这一行代码
            if number % i == 0:
                return False
        else:
            return True


while True:
    x += 2                                    # 除二以外,没有偶素数
    with open("D:/PrimeNumber.txt", "w") as f:
        f.write("{0}\n".format(x))
        print(x)
        N.append(x)                           # 素数列表更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值