diff --git a/src/main/java/com/thealgorithms/maths/GenericRoot.java b/src/main/java/com/thealgorithms/maths/GenericRoot.java index 1058da9e7..07f4756f9 100644 --- a/src/main/java/com/thealgorithms/maths/GenericRoot.java +++ b/src/main/java/com/thealgorithms/maths/GenericRoot.java @@ -4,27 +4,27 @@ package com.thealgorithms.maths; * Algorithm explanation: * https://technotip.com/6774/c-program-to-find-generic-root-of-a-number/#:~:text=Generic%20Root%3A%20of%20a%20number,get%20a%20single%2Ddigit%20output.&text=For%20Example%3A%20If%20user%20input,%2B%204%20%2B%205%20%3D%2015. */ -public class GenericRoot { - - public static void main(String[] args) { - int number1 = 1234; - int number2 = 12345; - int result1 = genericRoot(number1); - int result2 = genericRoot(number2); - System.out.println("Generic root of " + number1 + " is: " + result1); - System.out.println("Generic root of " + number2 + " is: " + result2); +public final class GenericRoot { + private GenericRoot() { } - private static int genericRoot(int n) { - int root = 0; - while (n > 0 || root > 9) { - if (n == 0) { - n = root; - root = 0; - } - root += n % 10; - n /= 10; + private static int base = 10; + + private static int sumOfDigits(final int n) { + assert n >= 0; + if (n < base) { + return n; } - return root; + return n % base + sumOfDigits(n / base); + } + + public static int genericRoot(final int n) { + if (n < 0) { + return genericRoot(-n); + } + if (n > base) { + return genericRoot(sumOfDigits(n)); + } + return n; } } diff --git a/src/test/java/com/thealgorithms/maths/GenericRootTest.java b/src/test/java/com/thealgorithms/maths/GenericRootTest.java new file mode 100644 index 000000000..50858cde1 --- /dev/null +++ b/src/test/java/com/thealgorithms/maths/GenericRootTest.java @@ -0,0 +1,24 @@ +package com.thealgorithms.maths; + +import static java.util.Map.entry; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Map; +import org.junit.jupiter.api.Test; + +public class GenericRootTest { + private final Map testCases = Map.ofEntries(entry(0, 0), entry(1, 1), entry(12345, 6), entry(123, 6), entry(15937, 7), entry(222222, 3), entry(99999, 9)); + @Test + public void testGenericRoot() { + for (final var tc : testCases.entrySet()) { + assertEquals(tc.getValue(), GenericRoot.genericRoot(tc.getKey())); + } + } + + @Test + public void testGenericRootWithNegativeInputs() { + for (final var tc : testCases.entrySet()) { + assertEquals(tc.getValue(), GenericRoot.genericRoot(-tc.getKey())); + } + } +}