さて、お待ちかねの問題提示です。
この問題を解いてみてください。私にはどういううまい解き方があるのか皆目見当もつきません。そこでパソコン登場ということで次のように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