[LeetCode] Perfect Number 完美數字

 

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

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

 

Example:post

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

 

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

 

這道題讓咱們判斷給定數字是否爲完美數字,並給來完美數字的定義,就是一個整數等於除其自身以外的全部的因子之和。那麼因爲不能包含自身,因此n一定大於1。其實這道題跟以前的判斷質數的題蠻相似的,都是要找因子。因爲1確定是因子,能夠提早加上,那麼咱們找其餘因子的範圍是[2, sqrt(n)]。咱們遍歷這之間全部的數字,若是能夠被n整除,那麼咱們把i和num/i都加上,對於n若是是平方數的話,那麼咱們此時相同的因子加來兩次,因此咱們要判斷一下,若是相等,就再也不加 num/i。實際上,符合要求的完美數字不多,根本就沒有徹底平方數,咱們根本就不用擔憂會加兩次,固然,這都是從結果分析的,爲了嚴格按照題目的要求,仍是加上判斷吧。還有就是咱們也能夠在遍歷的過程當中若是累積和sum大於n了,直接返回false,可是感受加了也沒咋提升運行時間,因此乾脆就不加了。在循環結束後,咱們首先判斷num是否爲1,由於題目中說了不能加包括自己的因子,而後咱們再看sum是否和num相等,參見代碼以下:spa

 

解法一:code

class Solution {
public:
    bool checkPerfectNumber(int num) {
        int sum = 1;
        for (int i = 2; i * i <= num; ++i) {
            if (num % i == 0) {
                sum += i + (num / i == i ? 0 : num / i);
            }
        }
        return num != 1 && sum == num;
    }
};

 

下面這種方法叼的不行,在給定的n的範圍內其實只有五個符合要求的完美數字,因而就有這種枚舉的解法,那麼套用一句諸葛孔明的名言就是,我從未見過如此厚顏無恥之解法。哈哈,開個玩笑。寫這篇博客的時候,國足正和伊朗進行十二強賽,上半場0比0,但願國足下半場能進球,好運好運,不忘初心,方得始終~htm

 

解法二:blog

class Solution {
public:
    bool checkPerfectNumber(int num) {
        return num == 6 || num == 28 || num == 496 || num == 8128 || num == 33550336;
    }
};

 

相似題目:leetcode

Self Dividing Numbersget

 

參考資料:

https://leetcode.com/problems/perfect-number/

https://leetcode.com/problems/perfect-number/discuss/98594/simple-java-solution

 

LeetCode All in One 題目講解彙總(持續更新中...)

相關文章
相關標籤/搜索