人気だ。

        • -

昨日の、オーバーフローが原因なので「if(power < 0) break;」って1行書けば解決じゃないか、ってのを試してみた。システムテスト通った。つまり事前に気づいてこの1行を入れていれば部屋内1位になって賞金をもらえていた。TopCoderってマクロでショートコーディングしたり人のコードをチェックして撃墜するところに注目が集まりがちだけど、人間が間違えやすいパターンを把握してそこをきちんとテストするようにするのが一番の近道なんじゃないかという気がする。

        • -

人間は本質的に間違える生き物だから、同じ間違いを二度しないためには、人間に同じことをさせてはいけないのだ。とか言ってみる。

// long longでのpow. 
#include<boost/optional.hpp>
using namespace boost;
typedef long long LL;
typedef optional<LL> OLL;
OLL llpow(LL n, size_t m){
  LL result = 1LL, tmp;
  for(size_t i=0; i<m; i++){
    tmp = result * n;
    if(tmp / n != result){
      // overflow
      return OLL();
    }
    result = tmp;
  }
  return OLL(result);
}
OLL llpow(OLL n, size_t m){
  if(n) return llpow(*n, m);
  return n;
}


int main() {
  for(size_t i=0; i<12; i++){
    OLL p = llpow(100, i);
    if(p){
      cout << *p << endl;
    }else{
      cout << "overflow" << endl;
    }
  }
}
-----出力-----
1
100
10000
1000000
100000000
10000000000
1000000000000
100000000000000
10000000000000000
1000000000000000000
overflow
overflow

これを使えば同じ過ちはしない!