TopCoder Open 2R 500 - RepresentableNumbers

問題

全桁が奇数で表される数 2 つの和として表現できる数のうち,入力値以上で最小の数を答えよ.

考え方

とりあえず1の位を見る.これが奇数だったら奇数+奇数ということはあり得ないので却下.以後,この条件は省かれているものとする.
1の位が 0 だと 1+9, 3+7, 5+5 みたいに繰り上がりがあるパターンしか無いが,他の偶数では 2=1+1≡9+3,4=1+3=7+7,6=1+5≡9+7,8=3+5≡9+9 のように繰り上がりがある場合と無い場合とがあり得る.なのでそれぞれの条件で,上位部分が条件を満たすかチェックすれば良い.繰り上がりがある場合は10の位を1減らしてチェックすればいいだけ.
また,1の位以外が奇数のとき,2 個の奇数の和としては表せないので,一方の数はそれより上の桁が 0 であれば OK.

コード

class RepresentableNumbers
{
  bool isAllOdd(int x)
  {
    for( ; x ; x /= 10 )
      if( (x & 1) == 0 ) return false;
    return true;
  }
  bool isOK(int x)
  {
    if( x == 0 ) return true;
    int y = x / 10, z = x % 10;
    if( z == 0 ) return isOK(y - 1);
    if( z & 1 ) return isAllOdd(y);
    return isOK(y) || isOK(y - 1);
  }
public:
  int getNext(int X)
  {
    for( int x = X + (X&1) ; ; x += 2 )
      if( isOK(x) ) return x;
  }
};