さて、お待ちかねの問題提示です。
この問題を解いてみてください。私にはどういううまい解き方があるのか皆目見当もつきません。そこでパソコン登場ということで次のようにC言語とQBでプログラムしてみました。 コーディングは両方とも同じです。 28907 に 1 からの正整数を順次乗じた試算値について左4桁と右4桁が一致するかどうか検査していくだけです。プログラミングのポイントなんて特にありませんが, ロング変数を使わなければダメなことと4桁の数字切り出しをうまくやるということぐらいです。それから演算終了検査は解の候補値に関係なく行うことです。そうしないとプログラムが止まらなくなります。
/* MSC 5.1 */ #include <stdio.h> main() { long d; /* 28907 の整数倍の試算値 */ int n; /* 28907 に掛ける整数 */ long left4; /* 左4桁の数字 */ long right4; /* 右4桁の数字 */ long answer; /* 解 */ /* 解クリア */ answer = 0L; /* 28907 に 1 から順番に乗じていく */ for(n = 1; ; n++){ /* 解の候補値を試算 */ d = (long)n * 28907L; /* d は 99999999 を越えているか? 越えていれば計算終了 */ if(d >= 99999999L){ printf("\nAnswer = %ld\n", answer); exit(0); } /* 左と右を求める */ left4 = d / 10000L; /* 10000 で割って左4桁取り出し */ right4 = d % 10000L; /* 10000 で割った余りで右4桁取り出し */ /* * 左と右は同じか? 同じならば解として保存する */ if(left4 == right4){ answer = d; printf("%d * 28907 = %ld\n", n, d); } } } ' Quick Basic 4.5 ' 解クリア answer& = 0 ' 28907 に 1 から順番に乗じていく N% = 1 DO ' 解の候補値を試算 d& = N% * 28907& ' d は 99999999 を越えているか? 越えていれば計算終了 IF d& >= 99999999 THEN PRINT "Answer = ", answer& END END IF ' 左と右を求める left4& = d& \ 10000& ' 10000 で割って左4桁取り出し right4& = d& MOD 10000& ' 10000 で割った余りで右4桁取り出し ' 左と右は同じか? 同じならば解として保存する IF left4& = right4& THEN answer& = d& PRINT N% " * 28907 = ", d& END IF N% = N% + 1 LOOP