diff --git a/src/main/java/com/thealgorithms/maths/GCDUsingEuclid.java b/src/main/java/com/thealgorithms/maths/GCDUsingEuclid.java new file mode 100644 index 000000000000..36219bfd951b --- /dev/null +++ b/src/main/java/com/thealgorithms/maths/GCDUsingEuclid.java @@ -0,0 +1,38 @@ +package com.thealgorithms.maths; + +/** + * Euclidean algorithm to compute the Greatest Common Divisor (GCD). + * Wikipedia: https://en.wikipedia.org/wiki/Euclidean_algorithm + */ +public final class GCDUsingEuclid { + + private GCDUsingEuclid() { + // Utility class + } + + /** + * Computes GCD of two integers using Euclidean algorithm. + * + * @param a first integer + * @param b second integer + * @return gcd(a, b) + */ + public static int gcd(int a, int b) { + a = Math.abs(a); + b = Math.abs(b); + + if (a == 0) { + return b; + } + if (b == 0) { + return a; + } + + while (b != 0) { + int remainder = a % b; + a = b; + b = remainder; + } + return a; + } +} diff --git a/src/test/java/com/thealgorithms/maths/GCDUsingEuclidTest.java b/src/test/java/com/thealgorithms/maths/GCDUsingEuclidTest.java new file mode 100644 index 000000000000..4ae98528ece7 --- /dev/null +++ b/src/test/java/com/thealgorithms/maths/GCDUsingEuclidTest.java @@ -0,0 +1,26 @@ +package com.thealgorithms.maths; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +public class GCDUsingEuclidTest { + + @Test + void testPositiveNumbers() { + assertEquals(6, GCDUsingEuclid.gcd(54, 24)); + assertEquals(1, GCDUsingEuclid.gcd(17, 13)); + } + + @Test + void testWithZero() { + assertEquals(5, GCDUsingEuclid.gcd(0, 5)); + assertEquals(7, GCDUsingEuclid.gcd(7, 0)); + } + + @Test + void testNegativeNumbers() { + assertEquals(4, GCDUsingEuclid.gcd(-8, 12)); + assertEquals(9, GCDUsingEuclid.gcd(-9, -18)); + } +}