【LeetCode每日一题】——507.完美数

一【题目类别】

  • 数学

二【题目难度】

  • 简单

三【题目编号】

  • 507.完美数

四【题目描述】

  • 对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「完美数」。
  • 给定一个 整数 n, 如果是完美数,返回 true;否则返回 false。

五【题目示例】

  • 示例 1:

    • 输入:num = 28
    • 输出:true
      • 解释:28 = 1 + 2 + 4 + 7 + 14。1, 2, 4, 7, 和 14 是 28 的所有正因子。
  • 示例 2:

    • 输入:num = 7
    • 输出:false

六【解题思路】

  • 这题其实很简单,只需要正常枚举即可,从1遍历到 n u m num num的前一位,遇到可以整除 n u m num num的因子就加起来,最后判断是不是相等就可以,但是这样时间复杂度为 O ( n ) O(n) O(n),消耗的时间更是惨不忍睹,那怎样提高一下时间复杂度呢?
  • 我们可以考虑从2遍历到 n u m \sqrt{num} num ,理由如下:
    • 每个数都有因子1,所以不用再计算1
    • 如果 n u m num num有一个小于 n u m \sqrt{num} num 的因子 i i i,一定有一个大于 n u m \sqrt{num} num 的因子 n u m i \frac{\sqrt{num}}{i} inum
  • 这样我们就可以将时间复杂度降至 O ( n u m ) O(\sqrt{num}) O(num ),但仍有一些细节需要注意:
    • 1不是完美数,需要特判
    • 当计算 i ∗ i = n u m i * i = num ii=num这个相同因子的时候,只需要计算一次,不能重复计算
    • 将小于 n u m \sqrt{num} num 的因子 i i i求和,同时也将大于 n u m \sqrt{num} num 的因子 n u m i \frac{\sqrt{num}}{i} inum 与其求和
  • 最后返回结果即可

七【题目提示】

  • 1 < = n u m < = 1 0 8 1 <= num <= 10^{8} 1<=num<=108

八【时间频度】

  • 时间复杂度: O ( n ) O(\sqrt{n}) O(n ),其中 n n n为传入参数的大小
  • 空间复杂度: O ( 1 ) O(1) O(1)

九【代码实现】

  1. Java语言版
class Solution {
    public boolean checkPerfectNumber(int num) {
        if(num == 1){
            return false;
        }
        int res = 1;
        for(int i = 2;i * i <= num;i++){
            if(num % i == 0){
                res += i;
                if(i * i < num){
                    res += num / i;
                }
            }
        }
        return res == num;
    }
}
  1. C语言版
bool checkPerfectNumber(int num)
{
    if(num == 1)
    {
        return false;
    }
    int res = 1;
    for(int i = 2;i * i <= num;i++)
    {
        if(num % i == 0)
        {
            res += i;
            if(i * i < num)
            {
                res += num / i;
            }
        }
    }
    return res == num;
}
  1. Python版
class Solution:
    def checkPerfectNumber(self, num: int) -> bool:
        if num == 1:
            return False
        res = 1
        i = 2
        while i * i <= num:
            if num % i == 0:
                res += i
                if i * i < num:
                    res += num / i
            i += 1
        return res == num

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. C语言版
    在这里插入图片描述

  3. Python语言版
    在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IronmanJay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值