前言
个人小记
一、快乐数是什么?
如果对该数的每个数字取平方,然后将这些平方数相加,重复这个过程,最终得到的结果为1。如果这个过程无限循环但永远不会得到1,则该数不是快乐数。
例如:19
(1^2 + 9^2 = 1 + 81 = 82)
(8^2 + 2^2 = 64 + 4 = 68)
(6^2 + 8^2 = 36 + 64 = 100)
(1^2 + 0^2 + 0^2 = 1)
所以19是快乐数。
二、算法思路
有限变成无限的,是循环,利用快慢“指针”来判断是否是循环,如果是循环,则两个“指针”必然会相遇,即不是快乐数。(用于判断单向链表是否有环)
代码如下:
#include <stdio.h>
#include <math.h>
int next(int x)
{
int y = 0;
while (x)//求各数位的平方和
{
y += pow(x % 10, 2);
x /= 10;
}
return y;
}
int f(int n)
{
int p = n, q = n;//定义两个伪指针
while (q!=1)
{
q = next(next(q));//快的跑两步
p = next(p);//慢的跑一步
if (q == p && p != 1)return 0;//相遇是循环,即不是快乐数
}
return 1;//否则是快乐数
}
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
int x = f(n);
if (x)printf("是快乐数\n");
else printf("不是快乐数\n");
}
return 0;
}
输出如下:
1
是快乐数
2
不是快乐数
3
不是快乐数
7
是快乐数
19
是快乐数
20
不是快乐数
^Z
^Z
^Z
C:\haizei\Project1\x64\Debug\haizei1.exe (进程 19448)已退出,代码为 0。
按任意键关闭此窗口. . .