# 完美数 Perfect Number 原

叶枫啦啦

We define the Perfect Number is a positive integer that is equal to the sum of all its positive divisors except itself.

Now, given an integer n, write a function that returns true when it is a perfect number and false when it is not.

Example:

```Input: 28
Output: True
Explanation: 28 = 1 + 2 + 4 + 7 + 14```

Note: The input number n will not exceed 100,000,000. (1e8)

① 第一种思路是暴力解决，但是超时了。

public class Solution {
public boolean checkPerfectNumber(int num) {
if(num <= 0) return false;
int sum = 0;
for (int i = 1;i < num ;i ++ ) {
if (num % i == 0) {
sum += i;
}
}
if (num == sum) {
return true;
}else{
return false;
}
}
}

② 根据上一个解法，我们考虑2-sqrt（nums）范围内的数，之后的就是nums/之前的数。要注意的是要考虑到i！=num / i的情况。

public class Solution { //14ms
public boolean checkPerfectNumber(int num) {
if (num == 1) return false;
int sum = 0;
for (int i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) {
sum += i;
if (i != num / i) sum += num / i;
}
}
sum ++;
return sum == num;
}
}

public class Solution { //14ms
public boolean checkPerfectNumber(int num) {
if (num == 1) return false;
int sum = 0;
for (int i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) {
sum += i + num / i;
}
}
sum ++;
return sum == num;
}
}

6 = 1 + 2 + 3
28 = 1 + 2 + 3 + 4 + 5 + 6 + 7

public class Solution { //10ms
public boolean checkPerfectNumber(int num) {
if(num <= 1) {
return false;
}
int sum = 0;
int n = num;
while(n % 2 == 0) { //可以被2整除
n /= 2;
}
sum = n * (n + 1) / 2;
return sum == num;
}
}

④ sum = 1 + 2 + ...... + 最大的不能被2整除的因子。

public class Solution { //11ms
public boolean checkPerfectNumber(int num) {
if(num == 0 || num == 1) return false;
int sum = 1;
int n = 2;
while(num % n == 0){
sum += n;
sum += num / n;
n = 2 * n;
}

return sum == num ? true : false;
}
}

### 叶枫啦啦

LeetCode 279. Perfect Squares (完美平方数)

dby_freedom
12/05
0
0

Chicago_01
08/27
0
0
perfect shuffle 算法的一个线性复杂度实现

2014/03/20
0
2

2012/09/13
0
0

Perfect Scrollbar 简约，但完美的自定义滚动条插件。 完美意味着什么？ 无需对默认元素有任何更改 滚动条不应影响默认设计布局 滚动条的设计应（几乎）完全可定制 若容器或内容大小发生变化...

2017/08/29
200
0

PHP生成CSV之内部换行

2
0

8
0

5
0
JAVA-四元数类

public class Quaternion { private final double x0, x1, x2, x3; // 四元数构造函数 public Quaternion(double x0, double x1, double x2, double x3) { this.x0 = ......

Pulsar-V

20
0
Xshell利用Xftp传输文件,使用pure-ftpd搭建ftp服务

Xftp传输文件 如果已经通过Xshell登录到服务器，此时可以使用快捷键ctrl+alt+f 打开Xftp并展示Xshell当前的目录，之后直接拖拽传输文件即可。 pure-ftpd搭建ftp服务 pure-ftpd要比vsftp简单，...

6
0