問題描述
寫一個算法來判斷一個數是不是”快樂數”。
一個數是不是快樂是這麼定義的:對於一個正整數,每一次將該數替換爲他每個位置上的數字的平方和,然後重複這個過程直到這個數變爲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;
}
}
};