快乐数的判断

本文介绍了如何使用C语言实现快乐数的判断算法,通过设置快慢指针遍历数的平方和序列,判断是否存在循环,从而确定一个数是否为快乐数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

个人小记


一、快乐数是什么?

如果对该数的每个数字取平方,然后将这些平方数相加,重复这个过程,最终得到的结果为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。
按任意键关闭此窗口. . .


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值