ユークリッド互除法を…


先生「ユークリッド互除法を,何の言語でもいいから実装してみて下さいね」

と言ってRubyでの実装を見せてくれました.


Rubyは知らないですけどw


ということで,C++ユークリッド互除法を実装してみました.


#include <iostream>


// maxを求める(別に三項演算子でもいいけどw)
template<int IL, int IR>
struct f_max {
  enum {
    result = IL > IR ? IL :  IR
  };
};

// minを求める
template<int IL, int IR>
struct f_min {
  enum {
    result = IL < IR ? IL : IR
  };
};


// 実装
template<int IL, int IR>
struct f_gcd_impl {
  enum {
    result = f_gcd_impl<IR, IL % IR>::result
  };
};


// 小さい方が0なら終わり
template<int IR>
struct f_gcd_impl<IR, 0> {
  enum {
    result = IR
  };
};


// gcdメイン
template<int IL, int IR>
struct f_gcd {
  enum {
    result = f_gcd_impl<
            f_max<IL, IR>::result,
            f_min<IL, IR>::result
          >::result
  };
};


int main(){

  std::cout << f_gcd<72, 132>::result << estd::endl; // 12

  return 0;

}


なんとか動いているようです.


普通に三項演算子とか%とか使えるから結構簡単にできました.