From 0410cd07ef9b0ab56a423cff5768e2de99527ce4 Mon Sep 17 00:00:00 2001 From: Igor Pashev Date: Fri, 8 Jul 2011 01:20:07 +0400 Subject: Added C++ with ability to use GMP --- gcd.cpp | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 gcd.cpp diff --git a/gcd.cpp b/gcd.cpp new file mode 100644 index 0000000..2ac9b29 --- /dev/null +++ b/gcd.cpp @@ -0,0 +1,67 @@ +/* + * SYNOPSIS: + * + * # g++ -o gcd-cpp gcd.cpp + * # ./gcd-cpp 11 22 33 121 + * # 11 + * + * + * To use GNU Multiple Precision Arithmetic Library: + * + * # g++ -o gcd-cpp-gmp -DGMP -lgmpxx gcd.cpp + * # ./gcd-cpp-gmp 1234567890987654321 987654321234567 + * # 63 + * + */ + + +#include +#include +#include +#include + +using namespace std; + +#ifdef GMP + #include + typedef mpz_class Number; +#else + typedef unsigned int Number; +#endif // GMP + +typedef vector Numbers; + +Number gcd(Number a, Number b) +{ + Number c; + while (b != 0) { + c = b; + b = a % b; + a = c; + } + return a; +} + +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; +} + + +int main (int argc, char *argv[]) +{ + if (argc > 1) { + Numbers ns(argc - 1); + for(int n = 1; n < argc; ++n) { + stringstream str; + str << argv[n]; + str >> ns[n-1]; + } + cout << gcd(ns) << endl; + } + return EXIT_SUCCESS; +} + -- cgit v1.2.3