問題描述:
編寫一個算法來判斷一個數 n 是不是快樂數。
「快樂數」定義爲:對於一個正整數,每一次將該數替換爲它每個位置上的數字的平方和,然後重複這個過程直到這個數變爲 1,也可能是 無限循環 但始終變不到 1。如果 可以變爲 1,那麼這個數就是快樂數。
如果 n 是快樂數就返回 True ;不是,則返回 False 。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/happy-number
示例:
輸入:19
輸出:true
解釋:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
解題思路:
使用一個map鍵值對來存儲,計算過的數字,如果後面重複出現過了,則代表會循環
class Solution {
public:
bool isHappy(int n) {
if(n==1) return true;
int tmp = n;
int sum = 0;
map<int,int> m;
m[n]=1;
while(sum!=n && sum!=1){
sum = sumofnum(tmp);
if(m[sum]) return false;
m[sum]=1;
tmp = sum;
}
if(sum==1) return true;
else return false;
}
int sumofnum(int n){
int sum = 0;
while(n){
sum += (n%10)*(n%10);
n = n/10;
}
return sum;
}
};
後面看其他題解,其實用數學原理解釋,所有的不快樂數都會進入下列循環
所有不快樂數的數位平方和計算,最後都會進入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 的循環中。
可以更改判斷條件,節省空間複雜度。