summaryrefslogtreecommitdiff
path: root/gcd.cpp
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2022-11-07 14:14:50 +0200
committerIgor Pashev <pashev.igor@gmail.com>2022-11-07 14:20:43 +0200
commitc49bf6ce1b8923b0ccce0cb653489759feb79f42 (patch)
treeaf1afe30547f5682b38de1bbbfc97e4faa5ad55e /gcd.cpp
parent4edd3ef32bf3cac07eea48477aa369dddb4a2b30 (diff)
downloadgcd-c49bf6ce1b8923b0ccce0cb653489759feb79f42.tar.gz
C++: support std::reduce from C++17
Diffstat (limited to 'gcd.cpp')
-rw-r--r--gcd.cpp25
1 files 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 <iostream>
#include <sstream>
#include <vector>
-
-using namespace std;
+#if __cplusplus >= 201703L
+#include <execution>
+#include <numeric>
+#endif
#ifdef GMP
#include <gmpxx.h>
typedef mpz_class Number;
#else
typedef unsigned int Number;
-#endif // GMP
+#endif
+
+using namespace std;
typedef vector<Number> 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) {