問題:spa
We define the Perfect Number is a positive integer that is equal to the sum of all its positive divisors except itself.input
Now, given an integer n, write a function that returns true when it is a perfect number and false when it is not.it
Example:io
Input: 28 Output: True Explanation: 28 = 1 + 2 + 4 + 7 + 14
Note: The input number n will not exceed 100,000,000. (1e8)function
解決:class
① 第一種思路是暴力解決,可是超時了。進階
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;
}
}
}di
② 根據上一個解法,咱們考慮2-sqrt(nums)範圍內的數,以後的就是nums/以前的數。要注意的是要考慮到i!=num / i的狀況。vi
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;
}
}while
進階版****:
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;
}
}
③ 每一個完美數均可以寫成從1開始的幾個天然數之和,如:
6 = 1 + 2 + 3
28 = 1 + 2 + 3 + 4 + 5 + 6 + 7
我麼能夠看出,最後一個加數是最大的不能被2整除的因子n。由求和公式能夠獲得最終的和: sum = n *(n + 1)/ 2。
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; } }