From c49bf6ce1b8923b0ccce0cb653489759feb79f42 Mon Sep 17 00:00:00 2001 From: Igor Pashev Date: Mon, 7 Nov 2022 14:14:50 +0200 Subject: C++: support std::reduce from C++17 --- gcd.cpp | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/gcd.cpp b/gcd.cpp index dfc2356..15fc4e9 100644 --- a/gcd.cpp +++ b/gcd.cpp @@ -8,7 +8,7 @@ * * To use GNU Multiple Precision Arithmetic Library: * - * # g++ -o gcd-cpp-gmp -DGMP -lgmpxx -lgmp gcd.cpp + * # g++ -DGMP gcd.cpp -lgmpxx -lgmp -o gcd-cpp-gmp * # ./gcd-cpp-gmp 1234567890987654321 987654321234567 * # 63 * @@ -18,15 +18,19 @@ #include #include #include - -using namespace std; +#if __cplusplus >= 201703L +#include +#include +#endif #ifdef GMP #include typedef mpz_class Number; #else typedef unsigned int Number; -#endif // GMP +#endif + +using namespace std; typedef vector Numbers; @@ -40,12 +44,25 @@ Number gcd(Number a, Number b) { return a; } +#if __cplusplus >= 201703L +class GCD { +public: + Number operator()(Number a, Number b) const { return gcd(a, b); }; +} GCD; + +Number gcd(const Numbers &ns) { + return reduce(execution::par, begin(ns), end(ns), Number(0), GCD); +} + +#else + Number gcd(const Numbers &ns) { Number r = 0; for (Numbers::const_iterator n = ns.begin(); n != ns.end(); ++n) r = gcd(*n, r); return r; } +#endif int main(int argc, char *argv[]) { if (argc > 1) { -- cgit v1.2.3