https://leetcode-cn.com/problems/happy-number/
编写一个算法来判断一个数是不是“快乐数”。
一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
示例:
输入: 19 输出: true 解释: 1^2 + 9^2 = 82 8^2 + 2^2 = 68 6^2 + 8^2 = 100 1^2 + 0^2 + 0^2 = 1
方法1:概率算法
对于一个很大的数,它的值会快速缩减,进入循环列。换句话说,当进行很多次运算还没有得到1时,它很大概率就是非快乐数。
例如99999->405->41->17->50->25->29->85->89->145->42->20->4->16->37
bool isHappy(int n) {
int count=0,val=n; //count 作为计数器
while(1){
val = numb(val);
count++;
if(count==100) return false;
if(val==1) return true;
}
}
int numb(int n){
int number = 0,val=0;
while(n){
number = n%10;
val+=number*number;
n/=10;
}
return val;
}//8ms 经测试极限count值为7。
方法2:特征算法
非快乐数循环列一定含有4.
int numb(int n);
bool isHappy(int n) {
while(1){
n = numb(n);
if(n==1) return true;
if(n==4) return false;
}
}
int numb(int n){
int number = 0,val=0;
while(n){
number = n%10;
val+=number*number;
n/=10;
}
return val;
}