题目:判断一个数是否为快乐数,是就输出true,避免无限循环,快乐数定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为1,也可能是无限循环,但始终变不到1。如果这个过程结果为1,那么这个数就是快乐数。
解题思路:我们先分别找到一个正例和一个反例子——找到规律:经过多次运算快乐数最终为1且一直以1循环;非快乐数则将前面的运算结果再依次循环一遍;
所以,我们可以借助快慢指针进行判断。
快慢指针理解示图如下:
若将运算:每一次将该数替换为它每个位置上的数字的平方和定义为compute()函数,我们就可以通过以下语句来判断是否为快乐数:
do
{
// 快指针每次走两步,慢指针每次走一步
fast = compute(compute(fast));
slow = compute(slow);
} while (fast != 1 && slow != fast);
if(fast==1)
return 1;
return 0;
}
完整代码如下:
#include <stdio.h>
//快乐数
//采用快慢指针
int compute(int a)
{
int sum=0;
while(a)
{
int x=a%10;
sum+=x*x;
a/=10;
}
return sum;
}
int judgehappy(int a)
{
int fast = a;
int slow = a;
// while(fast!=1&&slow!=fast)
// {
// //快指针每次走两步,慢指针每次走一步
// fast = compute(compute(fast));
// slow = compute(slow);
// }!!!易错点!!!
//必须使用do-while循环,保证至少循环一次,否则10,100这样的快乐数就会判断错误
do
{
// 快指针每次走两步,慢指针每次走一步
fast = compute(compute(fast));
slow = compute(slow);
} while (fast != 1 && slow != fast);
if(fast==1)
return 1;
return 0;
}
int main()
{
int a;
printf("%s","请输入一个数:");
scanf("%d",&a);
if(judgehappy(a))
printf("%s","yes!");
else
printf("%s","no!");
return 0;
}