Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions src/main/java/com/thealgorithms/maths/HappyNumber.java
Original file line number Diff line number Diff line change
@@ -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.
Expand Down Expand Up @@ -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<Integer> seen = new HashSet<>();

while (num != 1 && !seen.contains(num)) {
seen.add(num);
num = sumOfSquares(num);
}

return num == 1;
}
}
32 changes: 12 additions & 20 deletions src/test/java/com/thealgorithms/maths/HappyNumberTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}
}