From 0b890fd8420e10ec18f0a9b016d67d4ab4c67452 Mon Sep 17 00:00:00 2001 From: "Max A. Jurankov" <76559516+astronmax@users.noreply.github.com> Date: Mon, 22 Feb 2021 22:21:58 +0300 Subject: [PATCH] feat: add program to calculate binomial coefficients (#1448) * Add program to calculate binomial coefficients * docs: add link to github profile, change cmath to cstdlib * correction of comments, adding math namespace * updating DIRECTORY.md * Adding binomial namespace, rename function and filename, correcting comments * updating DIRECTORY.md Co-authored-by: astronmax Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> --- DIRECTORY.md | 1 + math/binomial_calculate.cpp | 92 +++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 math/binomial_calculate.cpp diff --git a/DIRECTORY.md b/DIRECTORY.md index 91cecffc8db..2f3dba45e0e 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -136,6 +136,7 @@ ## Math * [Armstrong Number](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/math/armstrong_number.cpp) * [Binary Exponent](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/math/binary_exponent.cpp) + * [Binomial Calculate](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/math/binomial_calculate.cpp) * [Check Amicable Pair](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/math/check_amicable_pair.cpp) * [Check Factorial](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/math/check_factorial.cpp) * [Check Prime](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/math/check_prime.cpp) diff --git a/math/binomial_calculate.cpp b/math/binomial_calculate.cpp new file mode 100644 index 00000000000..abfedca6256 --- /dev/null +++ b/math/binomial_calculate.cpp @@ -0,0 +1,92 @@ +/** + * @file + * @brief Program to calculate [Binomial + * coefficients](https://en.wikipedia.org/wiki/Binomial_coefficient) + * + * @author [astronmax](https://github.com/astronmax) + */ + +#include /// for assert +#include /// for int32_t type +#include /// for atoi +#include /// for IO operations + +/** + * @namespace math + * @brief Mathematical algorithms + */ +namespace math { +/** + * @namespace binomial + * @brief Functions for [Binomial + * coefficients](https://en.wikipedia.org/wiki/Binomial_coefficient) + * implementation + */ +namespace binomial { +/** + * @brief Function to calculate binomial coefficients + * @param n first value + * @param k second value + * @return binomial coefficient for n and k + */ +size_t calculate(int32_t n, int32_t k) { + // basic cases + if (k > (n / 2)) + k = n - k; + if (k == 1) + return n; + if (k == 0) + return 1; + + size_t result = 1; + for (int32_t i = 1; i <= k; ++i) { + result *= n - k + i; + result /= i; + } + + return result; +} +} // namespace binomial +} // namespace math + +/** + * @brief Test implementations + * @returns void + */ +static void tests() { + // tests for calculate function + assert(math::binomial::calculate(1, 1) == 1); + assert(math::binomial::calculate(57, 57) == 1); + assert(math::binomial::calculate(6, 3) == 20); + assert(math::binomial::calculate(10, 5) == 252); + assert(math::binomial::calculate(20, 10) == 184756); + assert(math::binomial::calculate(30, 15) == 155117520); + assert(math::binomial::calculate(40, 20) == 137846528820); + assert(math::binomial::calculate(50, 25) == 126410606437752); + assert(math::binomial::calculate(60, 30) == 118264581564861424); + assert(math::binomial::calculate(62, 31) == 465428353255261088); + + std::cout << "[+] Binomial coefficients calculate test completed" + << std::endl; +} + +/** + * @brief Main function + * @param argc commandline argument count + * @param argv commandline array of arguments + * @returns 0 on exit + */ +int main(int argc, const char* argv[]) { + tests(); // run self-test implementations + + if (argc < 3) { + std::cout << "Usage ./binomial_calculate {n} {k}" << std::endl; + return 0; + } + + int32_t n = atoi(argv[1]); + int32_t k = atoi(argv[2]); + + std::cout << math::binomial::calculate(n, k) << std::endl; + return 0; +}