6ms内输出8个完数的因式分解形式的实现

题目描述:

要求实现一个计算整数因子和的简单函数,并利用其实现另一个函数,输出最小的N(1 <= N <=8)个完数。所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。

输入格式:

 一个正整数N,如:1‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬

输出格式:

 如:6=1+2+3

代码实现

import time


def isPrime(n):  # 判断是否是素数
    sign = 1
    if n < 2:
        sign = 0
    elif n == 2 or n == 3:
        pass
    elif n % 2 == 0 or n % 3 == 0:
        sign = 0
    else:
        for k in range(6, int(n ** 0.5 + 2), 6):
            if n % (k - 1) == 0 or n % (k + 1) == 0:
                sign = 0
    return sign


def factorization(num):  # 做因式分解,不包含本身,所以1单独加进去
    factor = set()
    factor.add(1)
    for i in range(2, int(num ** 0.5) + 1):
        if num % i == 0:
            factor.add(i)
            factor.add(int(num / i))  # 有个别重复不要怕,集合去重
    return list(factor)


def perfect(num):  # 完数的求解,及因式分解
    if isPrime(num) and isPrime(pow(2, num) - 1):  # 不要交换顺序,要先判断num是不是素数,因为num比较小,这样比较快
        one = pow(2, num - 1)  # one*two 就是完全数,欧拉证明的
        two = pow(2, num) - 1  # 梅森素数
        factor = factorization(one)  # 只对这个偶数数做因式分解,下面解释
        ls = factor.copy()  # 必须做深拷贝,不然ls和factor指向同一个东西,ls用来存放完数的因式
        for i in factor:
            ls.append(i * two)  # 根据因式的特点,可以看到one的因式乘梅森素数,就会得到剩下一边的因式,就可以不用对完数做因式分解,只用对偶数做因式分解
        ls.append(one)  # 把偶数这个数加入到因式列表,至此得到了完整的因式
        ls.sort()  # 排个序
        ls = list(map(str, ls))  # 把ls里面的因式int弄成str
        ls = "+".join(ls)
        print("{}={}".format(one * two, ls))
        return 1  # 返回一个ture,给下面的if做判断


N = int(input())
cnt, num = 0, 2
begin = time.time()
while cnt != N:
    if perfect(num):
        cnt += 1
    num += 1
print("total time is ", (time.time() - begin))

输出结果:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值