2021年的最后一天,就以这道简单题来落幕吧
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年的到来是不可避免的。
祝大家新的一年,有新的气象吧。