From 7eb4d88ab3db759f40bdc3a4c537885efa67394b Mon Sep 17 00:00:00 2001 From: Piotr Idzik Date: Mon, 31 Jul 2023 18:07:44 +0000 Subject: [PATCH 1/5] tests: add `GenericRootTest` --- .../com/thealgorithms/maths/GenericRoot.java | 2 +- .../thealgorithms/maths/GenericRootTest.java | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/thealgorithms/maths/GenericRootTest.java diff --git a/src/main/java/com/thealgorithms/maths/GenericRoot.java b/src/main/java/com/thealgorithms/maths/GenericRoot.java index 1058da9e72c8..6ac8b864241d 100644 --- a/src/main/java/com/thealgorithms/maths/GenericRoot.java +++ b/src/main/java/com/thealgorithms/maths/GenericRoot.java @@ -15,7 +15,7 @@ public static void main(String[] args) { System.out.println("Generic root of " + number2 + " is: " + result2); } - private static int genericRoot(int n) { + public static int genericRoot(int n) { int root = 0; while (n > 0 || root > 9) { if (n == 0) { 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 000000000000..e5c5764f9d48 --- /dev/null +++ b/src/test/java/com/thealgorithms/maths/GenericRootTest.java @@ -0,0 +1,17 @@ +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 { + @Test + public void testGenericRoot() { + 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)); + for (final var tc : testCases.entrySet()) { + assertEquals(tc.getValue(), GenericRoot.genericRoot(tc.getKey())); + } + } +} \ No newline at end of file From 3531ea14332df55d80488a7550e25df2e51a5772 Mon Sep 17 00:00:00 2001 From: Piotr Idzik Date: Mon, 31 Jul 2023 18:16:14 +0000 Subject: [PATCH 2/5] fix: handle negative inputs --- .../java/com/thealgorithms/maths/GenericRoot.java | 3 +++ .../java/com/thealgorithms/maths/GenericRootTest.java | 11 +++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/GenericRoot.java b/src/main/java/com/thealgorithms/maths/GenericRoot.java index 6ac8b864241d..11e1d0f17585 100644 --- a/src/main/java/com/thealgorithms/maths/GenericRoot.java +++ b/src/main/java/com/thealgorithms/maths/GenericRoot.java @@ -16,6 +16,9 @@ public static void main(String[] args) { } public static int genericRoot(int n) { + if (n < 0) { + return genericRoot(-n); + } int root = 0; while (n > 0 || root > 9) { if (n == 0) { diff --git a/src/test/java/com/thealgorithms/maths/GenericRootTest.java b/src/test/java/com/thealgorithms/maths/GenericRootTest.java index e5c5764f9d48..50858cde1ef0 100644 --- a/src/test/java/com/thealgorithms/maths/GenericRootTest.java +++ b/src/test/java/com/thealgorithms/maths/GenericRootTest.java @@ -7,11 +7,18 @@ 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() { - 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)); for (final var tc : testCases.entrySet()) { assertEquals(tc.getValue(), GenericRoot.genericRoot(tc.getKey())); } } -} \ No newline at end of file + + @Test + public void testGenericRootWithNegativeInputs() { + for (final var tc : testCases.entrySet()) { + assertEquals(tc.getValue(), GenericRoot.genericRoot(-tc.getKey())); + } + } +} From 6ec1b90e2dcce1ad65381dc502e07e9d324143cb Mon Sep 17 00:00:00 2001 From: Piotr Idzik Date: Mon, 31 Jul 2023 18:23:49 +0000 Subject: [PATCH 3/5] refactor: simplify `genericRoot` by using recursion --- .../com/thealgorithms/maths/GenericRoot.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/GenericRoot.java b/src/main/java/com/thealgorithms/maths/GenericRoot.java index 11e1d0f17585..150a601c0da5 100644 --- a/src/main/java/com/thealgorithms/maths/GenericRoot.java +++ b/src/main/java/com/thealgorithms/maths/GenericRoot.java @@ -15,19 +15,21 @@ public static void main(String[] args) { System.out.println("Generic root of " + number2 + " is: " + result2); } + private static int sumOfDigits(int n) { + assert n >= 0; + if (n < 10) { + return n; + } + return n % 10 + sumOfDigits(n / 10); + } + public static int genericRoot(int n) { if (n < 0) { return genericRoot(-n); } - int root = 0; - while (n > 0 || root > 9) { - if (n == 0) { - n = root; - root = 0; - } - root += n % 10; - n /= 10; + if (n > 10) { + return genericRoot(sumOfDigits(n)); } - return root; + return n; } } From 12fbb33d5255fb7c7b7ddb23e155127346cbebfe Mon Sep 17 00:00:00 2001 From: Piotr Idzik Date: Mon, 31 Jul 2023 18:25:24 +0000 Subject: [PATCH 4/5] refactor: make`GenericRoot` a proper utility class --- .../java/com/thealgorithms/maths/GenericRoot.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/GenericRoot.java b/src/main/java/com/thealgorithms/maths/GenericRoot.java index 150a601c0da5..35959b67b300 100644 --- a/src/main/java/com/thealgorithms/maths/GenericRoot.java +++ b/src/main/java/com/thealgorithms/maths/GenericRoot.java @@ -4,15 +4,8 @@ * 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 sumOfDigits(int n) { From fec00bf02e33961b77108e86a47c1d78c570253d Mon Sep 17 00:00:00 2001 From: Piotr Idzik Date: Mon, 31 Jul 2023 18:33:05 +0000 Subject: [PATCH 5/5] style: add `base`, mark input args as `final` --- .../java/com/thealgorithms/maths/GenericRoot.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/GenericRoot.java b/src/main/java/com/thealgorithms/maths/GenericRoot.java index 35959b67b300..07f4756f93f8 100644 --- a/src/main/java/com/thealgorithms/maths/GenericRoot.java +++ b/src/main/java/com/thealgorithms/maths/GenericRoot.java @@ -8,19 +8,21 @@ public final class GenericRoot { private GenericRoot() { } - private static int sumOfDigits(int n) { + private static int base = 10; + + private static int sumOfDigits(final int n) { assert n >= 0; - if (n < 10) { + if (n < base) { return n; } - return n % 10 + sumOfDigits(n / 10); + return n % base + sumOfDigits(n / base); } - public static int genericRoot(int n) { + public static int genericRoot(final int n) { if (n < 0) { return genericRoot(-n); } - if (n > 10) { + if (n > base) { return genericRoot(sumOfDigits(n)); } return n;