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; } };