如果有单个数,例如8 ,那么应该让它乘自身,例如 8=64=52=……
假设我们从数字 19 开始计算:
- 1^2 + 9^2 = 82
- 8^2 + 2^2 = 68
- 6^2 + 8^2 = 100
- 1^2 + 0^2 + 0^2 = 1
在这个例子中,我们最终得到了 1,因此 19 是一个 happy number。但是如果我们从数字 4 开始计算:
- 4^2 = 16
- 1^2 + 6^2 = 37
- 3^2 + 7^2 = 58
- 5^2 + 8^2 = 89
- 8^2 + 9^2 = 145
- 1^2 + 4^2 + 5^2 = 42
- 4^2 + 2^2 = 20
- 2^2 + 0^2 = 4
在这个例子中,我们最终又回到了 4,说明我们陷入了一个循环。
因此,如果我们在计算过程中得到了一个已经出现过的数字,就说明
我们陷入了一个循环,应该返回 false。
也就是说我们求这道题的解一定会得到两个解:
1.最后一定可以求到1这个值,说明是快乐数:
2.最后会求到本身,说明有环,并且在环中求不到1,不是快乐数:
3.在环中求导1,是快乐数
既然可能有环,那么我们可以用快慢指针的方法,如果快慢指针在环中相遇,那么这个数肯定是1,否则就不是。
快慢指针初始状态:
开始走,slow一次走一步,fast一次走两步:
int step(int n)
{ int sum=0;
while(n)
{
int t=n%10;
sum+=t*t;
n/=10;
}
return sum;
}
bool isHappy(int n) {
int slow=n;
int fast=step(n);
while(slow!=fast)
{
slow=step(slow);
fast=step(step(fast));
} if(fast==1)return true;
return false;