2整数の最大公約数を求めます。以下の条件を満たせば、必ずしも整数型でなくてもかまいません。
- 代入可能である
- <演算子が使用可能
- %演算子が使用可能
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
template<class T> T gcd(T m, T n) { if (m < T(0) || n < T(0)) { return T(-1); } T r; while (T(0) < n) { r = m % n; m = n; n = r; } return m; } |
以下は、再帰を利用したメタ関数版です。
0 1 2 3 4 5 6 7 8 9 10 11 12 |
template<unsigned long M, unsigned long N> struct tgcd { static const unsigned int value = tgcd<N, M % N>::value; }; template<unsigned long M> struct tgcd<M, 0UL> { static const unsigned long value = M; }; |
今回はせっかくなので、C++11向けのconstexpr版も作ってみましょう。なお、C++14以降であれば、最初に掲載したgcd関数にconstexprを付けるだけでOKです。
0 1 2 3 4 5 6 |
template <class T> constexpr T gcd(T m, T n) { return n == 0 ? m : gcd(n, m % n); } |