- Path
- 82 → 68 → 100 → 1
Check Happy Number in PHP
What you’ll learn
- The happy iteration: replace
nby the sum of squared decimal digits until1or a repeat. - Floyd’s tortoise and hare on that map—
O(1)extra memory like the reference. - A range scan for happy numbers in
[1, 50], plus a live preview and unhappy-cycle notes.
Overview
Happy numbers are a small playground for iteration and cycle detection. The digit-square map has finite image for bounded n, so every orbit eventually cycles; Floyd detects that cycle without a hash table.
Two programs
19 classification and 1–50 listing from the reference.
Live preview
Positive safe integers; same Floyd logic as the PHP samples.
Rigor
Positive definition, known unhappy cycle, and why do-while matches Floyd here.
Prerequisites
Digit extraction with % 10 and intdiv($n, 10), loops, and PHP functions.
- Basic PHP syntax, functions, and
echooutput. - Optional: hash-set cycle detection as an alternative to Floyd.
What is a happy number?
Let f(n) be the sum of the squares of the decimal digits of n. Starting from a positive integer n, iterate n ← f(n). If you reach 1, the start was happy; otherwise you enter a cycle that never contains 1.
For 19: 82 → 68 → 100 → 1, so 19 is happy (as in the reference walkthrough).
Digit map
For n = ∑ di 10i with digits di ∈ {0,…,9}, define f(n) = ∑ di2. Happy numbers are exactly those n whose forward orbit under f reaches 1.
f(19)12 + 92 = 82, then 82 + 22 = 68, 62 + 82 = 100, 12 + 02 + 02 = 1.
Intuition
- Enters
- 4 → 16 → … cycle
Takeaway: you never need unbounded memory: either you hit 1 or you eventually repeat.
Live preview
Positive integers in the JavaScript safe range. Uses the same Floyd logic as the PHP examples.
Algorithm
Goal: decide whether iterating f (sum of squared digits) reaches 1.
Implement f(n)
Peel decimal digits with n % 10, square, accumulate, divide by 10.
Floyd on the orbit
Maintain slow ← f(slow) and advance fast by two steps of f using fast = sum_of_squares(sum_of_squares(fast)). When they meet, meeting at 1 means happy.
📜 Pseudocode
function sum_square_digits(n):
s = 0
while n > 0:
d = n mod 10
s += d * d
n = floor(n / 10)
return s
function is_happy(n):
slow = n
fast = n
repeat:
slow = sum_square_digits(slow)
fast = sum_square_digits(sum_square_digits(fast))
until slow == fast
return slow == 1Single value: 19
Same logic as the reference: helper function + Floyd cycle detection. This version is written in PHP and keeps the flow beginner friendly.
<?php
function sumOfSquares(int $n): int
{
$sum = 0;
while ($n > 0) {
$digit = $n % 10;
$sum += $digit * $digit;
$n = intdiv($n, 10);
}
return $sum;
}
function isHappyNumber(int $n): bool
{
$slow = $n;
$fast = $n;
do {
$slow = sumOfSquares($slow);
$fast = sumOfSquares(sumOfSquares($fast));
} while ($slow !== $fast);
return $slow === 1;
}
$number = 19;
echo isHappyNumber($number)
? "{$number} is a Happy Number.\n"
: "{$number} is not a Happy Number.\n";
?>Explanation
The do-while loop runs at least once, so even n = 1 is handled naturally and returns happy.
Happy numbers in [1, 50]
Range scan in PHP using the same isHappyNumber function.
<?php
function sumOfSquares(int $n): int
{
$sum = 0;
while ($n > 0) {
$digit = $n % 10;
$sum += $digit * $digit;
$n = intdiv($n, 10);
}
return $sum;
}
function isHappyNumber(int $n): bool
{
$slow = $n;
$fast = $n;
do {
$slow = sumOfSquares($slow);
$fast = sumOfSquares(sumOfSquares($fast));
} while ($slow !== $fast);
return $slow === 1;
}
$start = 1;
$end = 50;
echo "Happy numbers in the range {$start} to {$end}:\n";
for ($i = $start; $i <= $end; $i++) {
if (isHappyNumber($i)) {
echo $i . " ";
}
}
echo "\n";
?>Explanation
Each number is checked independently, and Floyd keeps memory usage constant.
Alternatives
Visited set. Store values in a hash set until repeat or 1—simple to code, O(k) memory for k orbit length.
Hard-coded cycle. Because every unhappy orbit hits the 4 → … cycle, you can return false as soon as any of those eight values appears—fast constants, less general pedagogy.
Interview: explain Floyd correctness (two speeds on a functional graph eventually meet inside the unique cycle).
❓ FAQ
🔄 Input / output examples
Change number in Example 1 or the loop bounds in Example 2.
| n | Happy? |
|---|---|
1 | Yes |
7 | Yes |
2 | No |
19 | Yes |
Edge cases and pitfalls
Floyd assumes the iteration is pure function on integers; any bug that mutates unrelated state can mask cycles.
Immediate happy
The do-while still runs one round; both pointers land on 1 and stop.
Not positive
Digit loop yields 0; Floyd meets at 0, not 1. Treat n < 1 separately in APIs.
Very large n
digit*digit fits in int for decimal digits; intermediate sums stay small until n is enormous—then widen types.
Other radices
Happy-base-b definitions replace decimal digits with base-b digits; results differ from base 10.
⏱️ Time and space complexity
| Method | Time (per check) | Extra space |
|---|---|---|
| Floyd (this page) | O(mu + lambda) digit-squaring steps | O(1) |
| Hash set of visited values | same asymptotic steps | O(k) for orbit length k |
Scan [1, N] | O(N) checks | O(1) beyond each check |
Here mu is the tail length before the cycle and lambda the cycle length under f.
Summary
- Happy: iterated digit-square sums eventually hit
1. - Detection: Floyd’s tortoise-and-hare on
favoids storing the path. - Watch-outs: define behavior for
n < 1; know the standard unhappy cycle.
If a positive integer is not happy, iterating digit-square sums always falls into the same unhappy cycle 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 (so Floyd’s detection need not store the whole path).
8 people found this page helpful
