【力扣时间】【507】【简单】完美数

2021年的最后一天,就以这道简单题来落幕吧

1、瞅瞅题

点我看题

很亲切的题干,简洁到没有一丝废话。

2、审题

很明显,我们需要做两件事:

  1. 求出一个数的所有因数。
  2. 让除自身以外的所有因数相加,判断是否等于自身。

看,每一步都没什么难点不是吗?
毕竟是一道简单题。

不过,还是有些需要注意的点。
完全平方数,其为一个因数的平方(如2*2 = 4, 2为4的因数,4为完全平方数)。此时因数仅计算一次。
1,作为自然数中极为特别的一个数,其是所有自然数的因数,也是因数仅为本身的自然数。所以很明显,1不能成为完美数

3、思路

感觉没什么好说的。
我们只需要对传入的数进行开方,得到的值作为我们遍历自然数的边界。
然后,让除数从2开始依次递增,根据是否能整除目标数,来判断除数是否为其因数,同时也能得到另一个因数。
最后我们在遍历中让所以求得的因数相加,判断是否和目标数一致即可。

4、动手!

class Solution {

    public boolean checkPerfectNumber(int num) {
        if (num == 1) {
            return false;
        }
        int count = 1;
        int div = 2;
        double line = Math.sqrt(num);
        while (div <= line) {
            //当某一除数可以整除时,此数为因数
            if (num % div == 0) {
                count += div;
                //完全平方数,因数仅计算一次
                count += num / div == div ? 0 : num / div;
            }

            div++;
        }

        return count == num;
    }
}

5、解读

大家会发现,我是让除数从2开始判断的。
毕竟完美数的要求是除自身以外的所有因数的和。而1作为所有自然数的因数,其另一个因数为自然数本身。所以我跳过了判断1,也就可以省去对自然数自身的判断。

//完全平方数,因数仅计算一次
count += num / div == div ? 0 : num / div;

同时这里加了一个特殊判断,对目标是为完全平方数时进行了特殊的处理。

除此之外,感觉也没什么可说了。

简单题嘛,轻轻松松。

6、提交

在这里插入图片描述

7、咀嚼

直接偷官解的了

在这里插入图片描述

8、学点没用的小知识

本以为今天没啥可学的了,但是官解又让我开了眼界。虽然没多少卵用

官解

官解的第一种和我的一致,关键是第二种。
原来108内的完美数仅有6,28,496,8128,33550336这5个,所以这题仅判断数字是否为这我个之一即可。
直接时间复杂度为O(1) 的解法。

9、总结

今天的没什么可讲的。

不过,这个没啥用的博客系列也连更了十多天了。
当初真的是即兴而为的,但没想到我能坚持这么多天。

但具体会坚持多久呢?
我将来是否又会更新些别的内容呢?

总之,这都不是2021年该考虑的事了。

今天是2021年的最后一天,不知道各位对这即将过去的一年是抱何看法?
但总之,2022年的到来是不可避免的。
祝大家新的一年,有新的气象吧。

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值