From 25e315de12667c5bb1e8cf56ece6f31ab37942e0 Mon Sep 17 00:00:00 2001 From: Gonzalo Diaz Date: Tue, 17 Sep 2024 20:07:25 -0300 Subject: [PATCH] =?UTF-8?q?[Hacker=20Rank]:=20Project=20Euler=20#1:=20Mult?= =?UTF-8?q?iples=20of=203=20and=205=20solved=20=E2=9C=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/hackerrank/projecteuler/euler001.md | 49 +++++++++++++++++++ .../hackerrank/projecteuler/euler001.hpp | 7 +++ .../src/hackerrank/projecteuler/euler001.cpp | 45 +++++++++++++++++ .../hackerrank/projecteuler/euler001.test.cpp | 29 +++++++++++ .../projecteuler/euler001.testcases.json | 5 ++ 5 files changed, 135 insertions(+) create mode 100644 docs/hackerrank/projecteuler/euler001.md create mode 100644 src/lib/exercises/include/exercises/hackerrank/projecteuler/euler001.hpp create mode 100644 src/lib/exercises/src/hackerrank/projecteuler/euler001.cpp create mode 100644 src/tests/unit/lib/hackerrank/projecteuler/euler001.test.cpp create mode 100644 src/tests/unit/lib/hackerrank/projecteuler/euler001.testcases.json diff --git a/docs/hackerrank/projecteuler/euler001.md b/docs/hackerrank/projecteuler/euler001.md new file mode 100644 index 0000000..d467a05 --- /dev/null +++ b/docs/hackerrank/projecteuler/euler001.md @@ -0,0 +1,49 @@ +# [Multiples of 3 and 5](https://www.hackerrank.com/contests/projecteuler/challenges/euler001) + +- Difficulty: #easy +- Category: #ProjectEuler+ + +If we list all the natural numbers below $ 10 $ that are multiples of + $ 3 $ or $ 5 $, we get $ 3, 5, 6 $ and $ 9 $. + The sum of these multiples + is $ 23 $. + +Find the sum of all the multiples of $ 3 $ or $ 5 $ below $ N $. + +## Input Format + +First line contains $ T $ that denotes the number of test cases. +This is followed by $ T $ lines, each containing an integer, $ N $. + +## Constraints + +- 1 $ \leq T \leq 10^5 $ +- 1 $ \leq N \leq 10^9 $ + +## Output Format + +For each test case, print an integer that denotes the sum of all the multiples +of $ 3 $ or $ 5 $ below $ N $. + +## Sample Input 0 + +```text +2 +10 +100 +``` + +## Sample Output 0 + +```text +23 +2318 +``` + +## Explanation 0 + +For $ N = 10 $, if we list all the natural numbers below $ 10 $ that are + multiples of $ 3 $ or $ 5 $, we get $ 3, 5, 6 $ and $ 9 $. + The sum of these multiples is $ 23 $. + +Similarly for $ N = 100 $, we get $ 2318 $. diff --git a/src/lib/exercises/include/exercises/hackerrank/projecteuler/euler001.hpp b/src/lib/exercises/include/exercises/hackerrank/projecteuler/euler001.hpp new file mode 100644 index 0000000..9dde1e8 --- /dev/null +++ b/src/lib/exercises/include/exercises/hackerrank/projecteuler/euler001.hpp @@ -0,0 +1,7 @@ +#pragma once + +namespace hackerrank::projecteuler { + +int euler001(int a, int b, int n); + +} diff --git a/src/lib/exercises/src/hackerrank/projecteuler/euler001.cpp b/src/lib/exercises/src/hackerrank/projecteuler/euler001.cpp new file mode 100644 index 0000000..1e7f6d3 --- /dev/null +++ b/src/lib/exercises/src/hackerrank/projecteuler/euler001.cpp @@ -0,0 +1,45 @@ +#include + +/** + * @link Problem definition [[docs/hackerrank/projecteuler/euler001.md]] + */ + +#include + +namespace hackerrank::projecteuler { + +// Function to return gcd of a and b +int gcd(int a, int b) { + // Find Minimum of a and b + int result = std::min(a, b); + while (result > 0) { + if (a % result == 0 && b % result == 0) { + break; + } + result--; + } + + // Return gcd of a and b + return result; +} + +// Function to find sum of Arithmetic Progression series +int sum_of_arithmetic_progression(int n, int d) { + // Number of terms + n = n / d; + return n * (1 + n) * d / 2; +} + +// Function to find the sum of all multiples of a and b below n +int euler001(int a, int b, int n) { + // Since, we need the sum of multiples less than N + n = n - 1; + + int lcm = (a * b) / gcd(a, b); + + return sum_of_arithmetic_progression(n, a) + + sum_of_arithmetic_progression(n, b) - + sum_of_arithmetic_progression(n, lcm); +} + +} // namespace hackerrank::projecteuler diff --git a/src/tests/unit/lib/hackerrank/projecteuler/euler001.test.cpp b/src/tests/unit/lib/hackerrank/projecteuler/euler001.test.cpp new file mode 100644 index 0000000..f5143aa --- /dev/null +++ b/src/tests/unit/lib/hackerrank/projecteuler/euler001.test.cpp @@ -0,0 +1,29 @@ +#include + +#include +#include +#include + +#include +#include +#include +using json = nlohmann::json; + +TEST_CASE("euler001 JSON Test Cases", + "[hackerrank] [jsontestcase] [projecteuler]") { + std::filesystem::path cwd = std::filesystem::current_path(); + std::string path = + cwd.string() + + "/unit/lib/hackerrank/projecteuler/euler001.testcases.json"; + + INFO("euler001 JSON test cases FILE: " << path); + + std::ifstream f(path); + json data = json::parse(f); + + for (auto testcase : data) { + int result = hackerrank::projecteuler::euler001( + testcase["a"], testcase["b"], testcase["n"]); + CHECK(result == testcase["expected"]); + } +} diff --git a/src/tests/unit/lib/hackerrank/projecteuler/euler001.testcases.json b/src/tests/unit/lib/hackerrank/projecteuler/euler001.testcases.json new file mode 100644 index 0000000..e2c03f5 --- /dev/null +++ b/src/tests/unit/lib/hackerrank/projecteuler/euler001.testcases.json @@ -0,0 +1,5 @@ +[ + { "a": 3, "b": 5, "n": 10, "expected": 23 }, + { "a": 3, "b": 5, "n": 100, "expected": 2318 }, + { "a": 3, "b": 5, "n": 1000, "expected": 233168 } +]