プログラムの実行結果は以下の通り。
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; }