プログラムの実行結果は以下の通り。
Find: 3703736/3 = 12345786666666667, 33.437sec Find: 493875/4 = 1234687500000000, 4.281sec Find: 6172839/5 = 12345678000000000, 56.266sec Find: 747407/6 = 1245678333333333, 6.625sec Find: 253/7 = 361428571429, 0sec Find: 98775/8 = 123468750000000, 0.875sec cnt:21093421
最小値は253。
253÷7=36.142857142857142857142857142857
上位8ケタを見ると 36.142857 で確かに1〜8の数字を1つずつしか利用していない。
これを出力するプログラムは以下の通り。
#include "puzutl.h"
YesNo check( cstring s) {
cstring ss = s;
char d[] = { 0,0,0,0,0,0,0,0,0,0};
int n;
for( int i=0; i< 8; i++) { // 調べるのは8文字のみ
n = *s - '0';
if( n == 0 || n == 9) return NO; // 結果は1〜8の数字のみ
if( d[n]) return NO; // 一度のみ出現しなければならない
d[n] = 1; // この数字が出現した
s++; // 次の文字
}
return YES;
}
int main( int argc, cstring argv[])
{
int cnt = 0;
ProcTime pt;
int pdec, psign;
astring s;
for( int b=3; b<= 9; b++) {
pt.start();
for( int a=1; a< 9876543; a++) {
//if( (a%1000)==0) ps( "%d\r", a);
double c = a/(double)b;
s = _fcvt( c, 10, &pdec, &psign ); // 文字だけに変換する
if( check(s)) { pt.end(); ps( "Find: %d/%d = %s, %gsec\n", a, b, s, pt.sec()); break;}
cnt++;
}
}
ps( "cnt:%d\n", cnt);
return 0;
}