
题目详情:. - 力扣(LeetCode)
将一个正整数的每位数的平方相加得到一个新数,再将得到的新数按相同的方法,再得到一个新数........ 由此不断的下去。这样的操作会得到两种情况:1.得到1的无穷循环(因为通过1得到的新数仍然还是1),2.得到非1的无穷循环。
如果能得到1 那么就是快乐数,反之不是
首先我来给出两个例图,帮助大家理解

这两种情况都是循环的。这就不由的让我们想到带环问题,对于带环问题我们可以记住一个结论性的东西:在带环问题中,我们可以定义出两个指针(快慢指针:快指针一次走两步,慢指针一次走一步)不论这两个指针相隔多远,最后一定会在环里面相遇。
所以,本题的解题思路就是:1.先实现一个函数其功能为:根据我们传的数得到新数 2.定义出快慢指针,走几步就相当于调用几次函数 3.利用循环,当两个指针相遇时跳出循环。然后判断此时快慢指针指向的元素是否为1,若是则为快乐数,反之不是。
class Solution {
public:
int sub(int num)//得到新数
{
int sum = 0;
while(num)
{
sum += (num % 10) * (num % 10);
num /= 10;
}
return sum;
}
bool isHappy(int n)
{
//快慢指针
int low = n;
int fast = sub(n);
while (fast != low)
{
low = sub(low);
fast = sub(sub(fast));
}
return fast == 1;//判断
}
};