题目描述:
要求实现一个计算整数因子和的简单函数,并利用其实现另一个函数,输出最小的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))