507. 完美数

博客探讨了四种检测完全数的方法:超时的朴素实现、logn时间复杂度优化、数学公式解析以及查表法。通过对比,强调了数学和查表在算法优化中的重要性,尤其是O(1)时间复杂度的查表方法,对于处理一定范围内的完全数问题极其高效。
摘要由CSDN通过智能技术生成
总结:
	说来说去,就是查表
	真实考试写的要不是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))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值