总结:
说来说去,就是查表
真实考试写的要不是fun4的查表,要不是fun2的logn算法
这个fun3中所谓的数学,确实有数学的影子,但是不还是在查表?
只是有了数学公式,有了数学证明
超时代码
def fun1(num):
'''
超时了
我只能说这是正常情况
他要是不超时,我还看不起他
:param num:
:return:
'''
sum_ = 0
for i in range(1, num // 2 + 1):
if num % i == 0:
sum_ += i
if sum_ == num:
return True
else:
return False
logn代码
def fun2(num):
'''
对于时间复杂度的优化
我现在直观的是优化到logn
:param num:
:return:
'''
if num == 1:
return False
sum_ = 0
i = 2
weibu = num // 2 + 1
while i < weibu: # 因为我会求和,所以这里就别慌放等号了把
if num % i == 0:
sum_ += i
weibu = num // i
sum_ += weibu
i += 1
if sum_ + 1 == num:
return True
else:
return False
数学查表代码
def fun3(num):
'''
说实话,我以为所谓的数学方法,也是快不过
这个logn算法的
事实证明,是我傻逼了
妈的o(1)我操操操操操,我只能说流弊好吧
我是废物
我不懂数学
目前没有发现奇完全数,只有偶完全数
偶完全数都可以写成2**(p-1)*(2**p-1)
其中p为素数,2**p-1也是素数
那我可以把这几个列出来
{2, 3, 5, 7, 13, 17, 19, 31}
然后就进行计算就好
因为数字小于10**8,而偶完全数只能有梅森素数得到
(2**31-1)*(2**30) = 2305843008139952128
:param num:
:return:
'''
nums = [2, 3, 5, 7, 13, 17, 19, 31]
for i in nums:
if (2 ** (i - 1)) * (2 ** i - 1) == num:
return True
return False
查表代码
def fun4(num):
'''
说实话,我第一眼看fun3的方法,惊为天人
奉其为真理
可当我真的写完了一遍之后
发现就是披着数学外衣的查表
所以就直接写个查表吧
:param num:
:return:
'''
dic={6:0, 28:0, 496:0, 8128:0, 33550336:0}
#开始正式查表
if num in dic:
return True
else:
return False
print(fun4(10))