diff --git a/src/main/java/com/thealgorithms/maths/HappyNumber.java b/src/main/java/com/thealgorithms/maths/HappyNumber.java index bfe746953b33..8c6943d604cb 100644 --- a/src/main/java/com/thealgorithms/maths/HappyNumber.java +++ b/src/main/java/com/thealgorithms/maths/HappyNumber.java @@ -1,5 +1,7 @@ package com.thealgorithms.maths; +import java.util.HashSet; + /** * A Happy Number is defined as a number which eventually reaches 1 when replaced * by the sum of the squares of each digit. @@ -54,4 +56,21 @@ private static int sumOfSquares(int num) { } return sum; } + + /** + * Checks whether the given number is a Happy Number using HashSet to detect cycles. + * + * @param n The number to check + * @return true if n is a Happy Number, false otherwise + */ + public static boolean isHappyNumber(int num) { + HashSet seen = new HashSet<>(); + + while (num != 1 && !seen.contains(num)) { + seen.add(num); + num = sumOfSquares(num); + } + + return num == 1; + } } diff --git a/src/test/java/com/thealgorithms/maths/HappyNumberTest.java b/src/test/java/com/thealgorithms/maths/HappyNumberTest.java index 4b7cb795406f..a5791ca5ab9c 100644 --- a/src/test/java/com/thealgorithms/maths/HappyNumberTest.java +++ b/src/test/java/com/thealgorithms/maths/HappyNumberTest.java @@ -3,30 +3,22 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; public class HappyNumberTest { - @Test - void testHappyNumbers() { - // Known happy numbers - assertTrue(HappyNumber.isHappy(1)); - assertTrue(HappyNumber.isHappy(7)); - assertTrue(HappyNumber.isHappy(19)); - assertTrue(HappyNumber.isHappy(100)); + @ParameterizedTest + @CsvSource({"1", "7", "19", "100", "565", "998", "1000000"}) + void testHappyNumbers(final int n) { + assertTrue(HappyNumber.isHappy(n)); + assertTrue(HappyNumber.isHappyNumber(n)); } - @Test - void testUnhappyNumbers() { - // Known unhappy numbers - assertFalse(HappyNumber.isHappy(2)); - assertFalse(HappyNumber.isHappy(4)); - assertFalse(HappyNumber.isHappy(20)); - } - - @Test - void testLargeNumber() { - // Just to check behavior with larger input - assertTrue(HappyNumber.isHappy(1000000)); // reduces to 1 eventually + @ParameterizedTest + @CsvSource({"2", "4", "20", "300", "999", "9999"}) + void testUnhappyNumbers(final int n) { + assertFalse(HappyNumber.isHappy(n)); + assertFalse(HappyNumber.isHappyNumber(n)); } }