- Happy Number
Write an algorithm to determine if a number is happy.
A happy number is a number defined by the following process: Starting with any positive integer, replace the number by the sum of the squares of its digits, and repeat the process until the number equals 1 (where it will stay), or it loops endlessly in a cycle which does not include 1. Those numbers for which this process ends in 1 are happy numbers.
Example
Example 1:
Input:19
Output:true
Explanation:
19 is a happy number
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
Example 2:
Input:5
Output:false
Explanation:
5 is not a happy number
25->29->85->89->145->42->20->4->16->37->58->89
89 appears again.
解法1:代码如下:
注意:平方不能写成n ^ 2,必须用pow()或n*n。
class Solution {
public:
/**
* @param n: An integer
* @return: true if this is a happy number or false
*/
bool isHappy(int n) {
if (n == 0) return false;
if (n == 1) return true;
unordered_set<long long> sumSet;
while (n > 1) {
long long sum = getSum(n);
if (sum == 1) return true;
if (sumSet.find(sum) != sumSet.end()) return false;
sumSet.insert(sum);
n = sum;
}
return false;
}
private:
long long getSum(long long n) {
long long sum = 0;
while(n > 0) {
int m = n % 10;
sum += m * m; //m ^ 2 is wrong!
n /= 10;
}
return sum;
}
};
解法2:用链表环的做法
int getNext(int x) {
int z = 0;
while (x ) {
z += (x % 10) * (x % 10);
x / 10;
}
return z;
}
bool isHappy(int n) {
int p = n, q = n; //注意这里q=n+1不对,因为n+1并不是n的下一个节点,getNext(n)才是。所以写成q=getNext(n)也对。
do {
P = getNext(p);
q = getNext(getNext(q));
} while (p != q && q != 1);
return q == 1;
}