快乐数的问题,也可以转化为链表找环的问题,将计算快乐数的每一个结果当做链表节点,如果这个链表中有环,那就不是快乐数,如果某一次的计算值是1,也就是到了尾节点,说明这个数就是快乐数。
下面是用C语言实现的代码:
#include <math.h>
bool isHappy(int n){
int slow = n;
int fast = n;
do {
slow = nextNumber(slow);
fast = nextNumber(fast);
fast = nextNumber(fast);
if (slow == fast) {
break;
}
} while (fast != 1);
return fast == 1;
}
// 求下一个值(每个位置数字的平方的和)
int nextNumber(int n) {
int sum = 0;
do {
sum += pow(n % 10, 2); // 余数,计算平方
n = n / 10;
} while (n != 0);
return sum;
}