TopCoder Open 2010 Round 2 Medium RepresentableNumbers

問題

整数Aの各桁が全て奇数のとき、Aを"totally odd"と呼ぶことにする。
更に、"totally odd"の数二つの和で表現できる数を"representable"と呼ぶ。


与えられた数xに対し、x以上で最小のrepresentableな数を求めよ。
x≦10^8を満たす。

解法

最下位の数が奇数ならrepresentableではない。
0,1が出てきたら次の桁に繰り上がってないとおかしい。(奇数+奇数は2以上なので)


よって(残りの桁の部分)-1を再帰で呼び出してrepresentableかどうか判定すればよい。

ソースコード

bool tood(int n){
	for(;n;n/=10)if(n%10%2==0)return 0;
	return 1;
}
bool repr(int x)
{
	if(x%2!=0)return 0;
	for(;x;x/=10)
	{
		if(x%10==0||x%10==1)
		{
			x/=10; x--;
			return tood(x)||repr(x);
		}
	}
	return 1;
}

class RepresentableNumbers {
	public:
	int getNext(int X) 
	{
		for(;;X++)if(repr(X))return X;
		return -1;
	}

本番中に気づけるようになりたい。頭わるい。