# Leetcode Happy-Number #### 2022-07-26 09:12 > ##### Algorithms: > #algorithm #Floyd_s_cycle_finding_algorithm > ##### Difficulty: > #coding_problem #difficulty-easy > ##### Additional tags: > #leetcode > ##### Revisions: > N/A ##### Related topics: ##### Links: - [Link to problem](https://leetcode.com/problems/happy-number/) ___ ### Problem Write an algorithm to determine if a number `n` is happy. A **happy number** is a number defined by the following process: - Starting with any positive integer, replace the number by the sum of the squares of its digits. - Repeat the process until the number equals 1 (where it will stay), or it **loops endlessly in a cycle** which does not include 1. - Those numbers for which this process **ends in 1** are happy. Return `true` _if_ `n` _is a happy number, and_ `false` _if not_. #### Examples **Example 1:** **Input:** n = 19 **Output:** true **Explanation:** 12 + 92 = 82 82 + 22 = 68 62 + 82 = 100 12 + 02 + 02 = 1 **Example 2:** **Input:** n = 2 **Output:** false #### Constraints - `1 <= n <= 231 - 1` ### Thoughts > [!summary] > This is a #Floyd_s_cycle_finding_algorithm This works, because as the problem mentioned, this will result in a endless loop. So, by using fast ans slow, we can determine whether there is a loop. And, when fast hit 1, we know slow will eventually reach the answer, so we return early. (but in the cost of time of checking). ### Solution ```cpp class Solution { int getDigitSqrt(int i) { int sum = 0; while (i) { sum += (i % 10) * (i % 10); i /= 10; } return sum; } public: bool isHappy(int n) { // Floyd cycle finding algorighm. int slow, fast; slow = fast = n; do { slow = getDigitSqrt(slow); fast = getDigitSqrt(fast); fast = getDigitSqrt(fast); if (fast == 1) { return true; } } while (fast != slow); return false; } }; ```