以下の式を満たすように□に1から9の数字を入れる。このとき灰色部分に入る数字は何か?
1から9と聞いたら数字の割り当て問題で解くと良い。パブロフの犬だな。1〜9なので,jのループを削り,数字は1から開始する。
以下のように文字を割り当てる。
条件判定部分は以下のようになる。
int x = a*b*c*d; int y = e*f*g*h; int z = i; if( x % y == 0 && x / y + z == 17) { ps( "Find (%d*%d*%d*%d)/(%d*%d*%d*%d)+%d=17\n", a, b, c, d, e, f, g, h, i); }しかしこれだと答えが沢山出てきてしまう(並べ替えを考慮しなければそれほど沢山でもないか)。
うーん,何か拙いのか?
よく見ると灰色の部分はある数字しか出力されないようだ。 プログラムを改良し,灰色部分に出現する数字だけを調べるようにする。
YesNo find[10]; // 出現した数字
ループの中の条件判定部分は以下のように変更する。
int x = a*b*c*d; int y = e*f*g*h; int z = i; if( x % y == 0 && x / y + z == 17) { //ps( "Find (%d*%d*%d*%d)/(%d*%d*%d*%d)+%d=17\n", a, b, c, d, e, f, g, h, i); find[z]=YES; }
最後にfind[ ]を調べるループを作成し,YESの時のINDEX値を出力する。
for( int z=1; z<= 9; z++) { if(find[z]) ps( "解:%d\n", z); }
答えは1つ出力された。
解速度
即