[HJ56 完全数计算]

描述

完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。

它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。

例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。

输入n,请输出n以内(含n)完全数的个数。

数据范围: 1≤n≤500000

输入描述:

输入一个数字n

输出描述:

输出不超过n的完全数的个数

示例1

输入:

1000

复制输出:

3

思路一:直接遍历

count = 0

n = int(input())

for i in range(1, n + 1):

    l = []

    for j in range(1, i + 1):

        if i%j == 0:

            l.append(j)

    l.pop()

    if sum(l) == i:

        count += 1

print(count)

优化:思路一如果数据过大可能会超时,所以可以考虑缩小约束的范围

import math

while True:

    try:

        n = int(input())

        count = 0

        for i in range(1, n + 1):

            l = []

            for j in range(1, int(math.sqrt(i)) + 1):

                y = int(i//j)

                if i % j == 0 and j != y:

                    l.append(j)

                    l.append(y)

                elif i % j == 0 and j == y:

                    l.append(j)

                else:

                    pass

            l.remove(max(l))

            if sum(l) == i:

                count += 1

        print(count)

    except:

        break

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值