快乐数是什么:从一道数学小题到循环检测算法
快乐数把一个整数反复换成各位数字的平方和,到 1 就快乐,陷进 4 的循环就不快乐。本文讲清判定原理,用集合或快慢指针检测循环,并带你手算 19 这条链。
快乐数是什么:从一道数学小题到循环检测算法
第一次见到快乐数,是在刷 LeetCode 第 202 题的时候。规则简单到一句话能说完:取一个正整数,把它各位数字分别平方再相加,得到新数,再对新数重复这个动作。如果某一步落到了 1,这个数就是快乐数;如果永远到不了 1,它就是不快乐数。可越简单的题越容易藏坑,我当时的代码就因为漏了一个细节卡了半小时。这篇文章把判定原理、循环为什么一定出现、以及两种常见检测写法都讲透。
平方和迭代到底在算什么
核心动作只有一个,叫各位数字平方和。把一个数拆成单个数字,每个数字平方,再把这些平方加起来。比如 23,拆成 2 和 3,得到 4 加 9 等于 13;再拆 13,得到 1 加 9 等于 10;再拆 10,得到 1 加 0 等于 1。落到 1 了,所以 23 是快乐数,整条链是 23、13、10、1。
很多人会把它和数字和搞混。数字和是直接相加,平方和是先平方再加。这一字之差结果天差地别:23 按数字和走是 2 加 3 等于 5,再走就拐进别的方向了。判定快乐数,用的永远是平方,不是直接求和。
手算一遍 19 这条链
光说规则不直观,拿 19 走一遍最清楚。
- 第一步:1 的平方加 9 的平方,等于 1 加 81,等于 82
- 第二步:8 的平方加 2 的平方,等于 64 加 4,等于 68
- 第三步:6 的平方加 8 的平方,等于 36 加 64,等于 100
- 第四步:1 的平方加 0 加 0,等于 1
完整链条是 19、82、68、100、1。它到达了 1,所以 19 是快乐数。这个例子之所以经典,是因为它中间窜到了三位数 100,看起来好像越走越大,却又一下坍缩回 1,把"数的大小不决定是否快乐"这件事演示得很到位。你可以打开 快乐数检测器,输入 19,屏幕上会原样打印这条链,每一步都看得见。
不快乐数为什么一定进 4 的循环
这是快乐数最妙的地方。如果一个数不快乐,它不会乱跑,也不会无限增大,而是迟早掉进同一个固定循环:
4、16、37、58、89、145、42、20,再回到 4。
不信可以拿 2 试:2 平方是 4,接着就是 4、16、37、58、89、145、42、20、4,一圈一圈转下去。任何不快乐数,链条走到最后都会汇入这个环。
背后的道理是一个上界。一个三位数各位平方和最大是 9 的平方乘 3,等于 243;位数再多,平方和增长远跟不上数本身,所以数值会被不断压回到一个有限范围内。范围有限,而迭代无穷,根据鸽巢原理,迟早会撞上一个之前出现过的值,也就是形成循环。要么这个循环就是孤零零的 1,这个数快乐;要么是那个 4 开头的八元环,这个数不快乐。除此之外没有第三种结局。
用集合或快慢指针检测循环
知道一定会出现重复值,检测就好办了。两种主流写法:
第一种是哈希集合。一边算平方和,一边把见过的每个值存进集合。下一步算出新值时先查集合:如果是 1,返回快乐;如果这个值已经在集合里,说明撞上循环了,返回不快乐;否则存进去继续。这种写法直观,空间是线性的。
第二种是 Floyd 快慢指针。慢指针每次走一步,快指针每次走两步,如果存在循环两者必然相遇,如果某一方先到 1 就是快乐数。它的好处是只用常数额外空间,不需要存历史值。
两种写法的判定结果完全一致,区别只在空间开销。我自己那次卡壳,就是哈希集合版本忘了在循环里把当前值插进集合,导致永远检测不到重复,程序对不快乐数直接转圈不返回。这个工具用的是哈希集合版本,并把走过的轨迹打印出来,所以你能拿屏幕上的链条逐步核对自己代码该算出什么,差一错误或漏插入一眼就现形。
当成趣味题和编程练习
快乐数是数论和编程的一块好试金石。给学生讲循环检测,它是绝佳的第一个例子:把 7 走到 1、把 2 落进 4 的环都画出来,"这个状态之前见过"这个抽象概念立刻变具体,后面再讲快慢指针就不用空口比划。出数论练习题时,可以用区间模式一次性列出某段里的全部快乐数,一百以内是 1、7、10、13、19、23、28、31、32、44、49、68、70、79、82、86、91、94、97、100,按顺序且经过验证,不必逐个手算。
如果你想顺手研究别的数列性质,比如把一个数拆成质因数看看结构,可以接着玩 质因数分解,和快乐数一样,都是从一个朴素定义出发,慢慢摸出整数世界的脾气。
小结
快乐数的全部秘密就两句话:反复求各位数字平方和,到 1 即快乐;否则必然掉进 4 开头的八元循环,用集合或快慢指针就能稳稳检测出来。它是一道门槛极低却能引出鸽巢原理和循环检测的好题,既适合课堂演示,也适合刷题热身。下次有人和你争某个数快不快乐,直接把链条走给他看就行。
Made by Toolora · Updated 2026-06-13