编写一个算法来判断一个数是不是“快乐数”。
一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
示例:
输入: 19
输出: true
解释:
1 <nobr aria-hidden="true"> 2 </nobr> <math xmlns="http://www.w3.org/1998/Math/MathML"> <msup> <mn> 2 </mn> </msup> </math> + 9 <nobr aria-hidden="true"> 2 </nobr> <math xmlns="http://www.w3.org/1998/Math/MathML"> <msup> <mn> 2 </mn> </msup> </math> = 82
8 <nobr aria-hidden="true"> 2 </nobr> <math xmlns="http://www.w3.org/1998/Math/MathML"> <msup> <mn> 2 </mn> </msup> </math> + 2 <nobr aria-hidden="true"> 2 </nobr> <math xmlns="http://www.w3.org/1998/Math/MathML"> <msup> <mn> 2 </mn> </msup> </math> = 68
6 <nobr aria-hidden="true"> 2 </nobr> <math xmlns="http://www.w3.org/1998/Math/MathML"> <msup> <mn> 2 </mn> </msup> </math> + 8 <nobr aria-hidden="true"> 2 </nobr> <math xmlns="http://www.w3.org/1998/Math/MathML"> <msup> <mn> 2 </mn> </msup> </math> = 100
1 <nobr aria-hidden="true"> 2 </nobr> <math xmlns="http://www.w3.org/1998/Math/MathML"> <msup> <mn> 2 </mn> </msup> </math> + 0 <nobr aria-hidden="true"> 2 </nobr> <math xmlns="http://www.w3.org/1998/Math/MathML"> <msup> <mn> 2 </mn> </msup> </math> + 0 <nobr aria-hidden="true"> 2 </nobr> <math xmlns="http://www.w3.org/1998/Math/MathML"> <msup> <mn> 2 </mn> </msup> </math> = 1
分析:
拆分 n 的每位数,求平方之和,不为 1 更新 n 为该平方和,否则返回 true
问题在于,拆多少次?我假设的 100 次,AC 了…
class Solution {
public boolean isHappy(int n) {
if (n == 1)
return true;
for (int i = 0; i < 100; i++) {
int sum = 0;
while (n != 0) {
sum += Math.pow(n % 10, 2);
n /= 10;
}
if (sum == 1)
return true;
else
n = sum;
}
return false;
}
}