public static void Happy(int n) { int sum = 0; int digit = 0; for (int i = 0; i < 20; i++) { while (n != 0) { digit = n%10; sum += digit*digit; n/=10; } System.out.print(sum + " "); n = sum; sum = 0; } }
使用代码测试一下每一代数字
n = 2 : 4 16 37 58 89 145 42 20 4 16 37 58 89 145 42 20 4 16 37 58 n = 3 : 9 81 65 61 37 58 89 145 42 20 4 16 37 58 89 145 42 20 4 16 n = 4 : 16 37 58 89 145 42 20 4 16 37 58 89 145 42 20 4 16 37 58 89 n = 5 : 25 29 85 89 145 42 20 4 16 37 58 89 145 42 20 4 16 37 58 89 n = 6 : 36 45 41 17 50 25 29 85 89 145 42 20 4 16 37 58 89 145 42 20 n = 7 : 49 97 130 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
可以发现
归纳一下这些简单数字就可以发现,对于任意一个非快乐数,最终会进入重复循环, ···不难发现,4即之后的结果就是新一轮循环。
那么我的第一个做法是检测4出现的次数 如果4出现次数超过两次, 那么就不是快乐数
{
int sum = 0;
int n1 = n;
int count = 0;
for (int i = 0; ; i++) {
while (true) {
int a = n%10;
sum += a*a;
n /= 10;
if (n == 0){break;}
}
if (sum==4){
count++;
}
if (sum==1){return true;}
if (count==2){return false;}
n = sum;
sum=0;
}
}
感觉不太行
想了一想 其实这道题为弗洛伊德查找算法提供了很好的条件
弗洛伊德查找算法原理见此处链接
代码如下:
{
//弗洛伊德循环查找算法
public static boolean isHappy(int n) {
int slow = n;
int fast = n;
while (true) {
slow = Next(slow);
fast = Next(Next(fast));
if (fast == 1) {
return true;
} else if (fast == slow) {
return false;
}
}
}
public static int Next(int n){
int sum = 0;
while (n != 0){
int digit = n % 10;
sum += digit*digit;
n /= 10;
}
return sum;
}
public static void main(String[] args) {
System.out.println(isHappy(19));
}
}
当测试用例为2这个数字的时候
4 16 37 58 89 145 42 20 4 16 37 58 89 145 42 20 4 16 37 58
第一步初始化slow和fast两个指针为头结点 (就是2)
第一次更新值
第二次
第三次
第四次
第五次
第六次
第七次
第八次
此时slow== fast
发现为循环链表(这里没有存储之前的值算不上链表)
return false
舒服了
如果觉得有用请点赞收藏, 谢谢啦