diff --git a/algorithm-exercises-java/src/main/java/ae/hackerrank/projecteuler/Euler003.java b/algorithm-exercises-java/src/main/java/ae/hackerrank/projecteuler/Euler003.java new file mode 100644 index 0000000..f603fcc --- /dev/null +++ b/algorithm-exercises-java/src/main/java/ae/hackerrank/projecteuler/Euler003.java @@ -0,0 +1,45 @@ +package ae.hackerrank.projecteuler; + +/** + * Even Fibonacci numbers. + * + * @link Problem definition [[docs/hackerrank/projecteuler/euler003.md]] + */ +public class Euler003 { + + private Euler003() {} + + private static Long primeFactor(Long n) { + if (n < 2) { + return null; + } + + Long divisor = n; + Long maxPrimeFactor = null; + + int i = 2; + while (i <= Math.sqrt(divisor)) { + if (divisor % i == 0) { + divisor = divisor / i; + maxPrimeFactor = divisor; + } else { + i += 1; + } + } + + if (maxPrimeFactor == null) { + return n; + } + + return maxPrimeFactor; + } + + /** + * Even Fibonacci numbers. + */ + public static Long euler003(long n) { + return primeFactor(n); + } +} + +//CHECKSTYLE.ON: JavadocParagraph diff --git a/algorithm-exercises-java/src/test/java/ae/hackerrank/projecteuler/Euler003Test.java b/algorithm-exercises-java/src/test/java/ae/hackerrank/projecteuler/Euler003Test.java new file mode 100644 index 0000000..77f332e --- /dev/null +++ b/algorithm-exercises-java/src/test/java/ae/hackerrank/projecteuler/Euler003Test.java @@ -0,0 +1,48 @@ +package ae.hackerrank.projecteuler; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; +import java.util.List; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.TestInstance.Lifecycle; +import util.JsonLoader; + + +@TestInstance(Lifecycle.PER_CLASS) +class Euler003Test { + + public static class Euler003TestCase { + public Long n; + public Long expected; + } + + private List testCases; + + @BeforeAll + public void setup() throws IOException { + String path = String.join("/", + "hackerrank", + "projecteuler", + "euler003.testcases.json"); + + this.testCases = JsonLoader.loadJson(path, Euler003TestCase.class); + } + + @Test void euler003() { + + for (Euler003TestCase test : testCases) { + Long solutionFound = Euler003.euler003(test.n); + + assertEquals(test.expected, solutionFound, + "%s(%d) => must be: %s".formatted( + "Euler003.euler003", + test.n, + test.expected + ) + ); + } + } +} diff --git a/algorithm-exercises-java/src/test/resources/hackerrank/projecteuler/euler003.testcases.json b/algorithm-exercises-java/src/test/resources/hackerrank/projecteuler/euler003.testcases.json new file mode 100644 index 0000000..44db00b --- /dev/null +++ b/algorithm-exercises-java/src/test/resources/hackerrank/projecteuler/euler003.testcases.json @@ -0,0 +1,4 @@ +[ + { "n": 10, "expected": 5 }, + { "n": 17, "expected": 17 } +]