朝日新聞2004年11月27日パズルパーク解答

プログラムの実行結果は以下の通り。

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;
}