快樂數(環路檢測)

問題描述

寫一個算法來判斷一個數是不是”快樂數”。
一個數是不是快樂是這麼定義的:對於一個正整數,每一次將該數替換爲他每個位置上的數字的平方和,然後重複這個過程直到這個數變爲1,或是無限循環但始終變不到1。如果可以變爲1,那麼這個數就是快樂數。
樣例
19 就是一個快樂數。
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

快樂數

以十進位爲例:
2 8 → 2²+8²=68 → 6²+8²=100 → 1²+0²+0²=1
3 2 → 3²+2²=13 → 1²+3²=10 → 1²+0²=1
3 7 → 3²+7²=58 → 5²+8²=89 → 8²+9²=145 → 1²+4²+5²=42 → 4²+2²=20 → 2²+0²=4 → 4²=16 → 1²+6²=37……
因此28和32是快樂數,而在37的計算過程中,37重覆出現,繼續計算的結果只會是上述數字的循環,不會出現1,因此37不是快樂數。
不是快樂數的數稱爲不快樂數(unhappy number),所有不快樂數的數位平方和計算,最後都會進入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 的循環中。

思路

類似於鏈表中檢測是否有環路。顯然要是快樂數,那麼最後的環是在“1”的節點循環。要是不是快樂數那麼就會在其他數中一直循環。因此巧妙的利用環路檢測算法處理,可以高效的解決這個問題。

class Solution {
public:
    /**
     * @param n an integer
     * @return true if this is a happy number or false
     */
    int calnumbers(int n){
        int res = 0;
        while(n){
            res = res + (n%10)*(n%10);
            n = n/10;
        }
        return res;
    } 

    bool isHappy(int n) {
        // Write your code here
        int low = n;
        int fast = n;
        //類似於鏈表中環形檢測
        do{
            low = calnumbers(low);
            fast = calnumbers(fast);
            fast = calnumbers(fast);
        }while(low != fast);
        if(low == 1){
            return true;
        }
        else{
            return false;
        }
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章