1.题目
2.题目分析
一个数,假设是17,那么按照题意就是把19变成1和9,然后分别平方在相加一起就是82,然后再重复就是64+4为68,再来一次就是100,这时重复多少次都是一样的为1,则19就是快乐数。
3.算法原理
从19快乐数和2非快乐数可以猜测出规律,且题目说了是无限循环1或者不是1,但是都是循环,也就是说会形成一个环状,那么就可以用双指针的操作,快慢指针,快的指针走俩步,慢的指针走一步,快指针会追上慢指针,再判断此时的值是否为一,因为快乐数一定是1.
4.代码实现
class Solution {
public:int number(int n){int sum=0;while(n){int t=n%10;sum+=t*t;n=n/10;}return sum;}bool isHappy(int n) {int quick=number(n);int slow=n;while(quick!=slow){quick=number(number(quick));slow=number(slow);}return slow==1;}
};
5.补充
简单介绍鸽巢原理,n+1各鸽子,n个巢穴,一定会有一个巢穴多一个鸽子
则下图的数字,题意有要求范围大小,则取超过限制的值,全是9则下一个数一定是最大的平方和,那么数字的范围就确定了,设x,则当x变化811次数后,就一定会跟这个范围的值重合,也就是会形成环状。