https://leetcode.com/problems/happy-number/
给定一个数字,每一次拿出这个数字 abc 的每一位执行 \(a^2 + b^2 + c^2\) ,得到一个新的数,然后再把新的数进行逐位平方取和,如果最后面得到的值为1,那么这个数就是 happy number
分析:
对于一个数A,经过一系列上面的操作后,达到数字B,经过一系列操作,最后还会到数字B,即 A --> B --> B --> B,因此我们需要找到是否出现了循环
- 这里采用快慢指针的方法,快的比慢的每次多跑2步,这样子快的会追上慢的,形成一个环;出现这种情况后再判断此时的值是否是1,如果是1就是快乐数
- 也可以使用 hashset, 判断经过操作后的值是否之前出现了,由于hashset需要占据空间,因此这里不采用
class Solution {
public:
bool isHappy(int n) {
int n1 = n, n2 = next(n);
while(n1!=n2 && n2 != n)
{
n1 = n2;
n2 = next(n2);
}
if(n1==1)
return true;
else
return false;
}
private:
int next(int n)
{
int result=0, temp=0;
while(n)
{
temp = n%10;
result += temp*temp;
n/=10;
}
return result;
}
};
还有一种方法:对于非快乐数,最后面肯定会到达4(待证明),因此只要判断每次经过上述操作是否得到4
class Solution {
public:
bool isHappy(int n) {
int result=0;
while(n!=1 && n!=4){
int result=0;
while(n)
{
result += (n%10) * (n%10);
n/=10;
}
n = result;
}
return n==1;
}
};