朝日新聞2006年9月8日パズル横丁解答

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

 181   2   3   7  78  91
 141   2   3   8  32  96
 134   2   3   8  33  88
 121   2   3   8  36  72
 113   2   3   8  40  60
 111   2   3   8  42  56
 135   2   3   9  22  99
 110   2   3   9  24  72
  95   2   3   9  27  54
  89   2   3   9  30  45
 123   2   3  10  18  90
  95   2   3  10  20  60
  79   2   3  10  24  40
  71   2   3  11  22  33
 115   2   3  12  14  84
  92   2   3  12  15  60
  81   2   3  12  16  48
  71   2   3  12  18  36
  67   2   3  12  20  30
  66   2   3  12  21  28
  69   2   3  14  15  35
 109   2   4   5  28  70
 101   2   4   5  30  60
  92   2   4   5  36  45
 110   2   4   6  14  84
  87   2   4   6  15  60
  76   2   4   6  16  48
  66   2   4   6  18  36
  62   2   4   6  20  30
  61   2   4   6  21  28
  67   2   4   7  12  42
  55   2   4   7  14  28
  95   2   4   8   9  72
  64   2   4   8  10  40
  50   2   4   8  12  24
  45   2   4   9  12  18
  43   2   4  10  12  15
  67   2   5   6   9  45
  53   2   5   6  10  30
  45   2   5   6  12  20
  38   3   4   5   6  20
Find
  38   3   4   5   6  20

これを式に直すと以下の通り。

プログラムのソースは以下の通り。

#include "puzutl.h"

int main( int argc, cstring argv[])
{
  int           m = 100;        // この値の範囲で探す
  int           sum = 0, A, B, C, D, E;
  for( int a=2; a< m; a++) {
    for( int b=a+1; b< m; b++) {
      for( int c=b+1; c< m; c++) {
        for( int d=c+1; d< m; d++) {
          for( int e=d+1; e< m; e++) {
            int T1 = b*c*d*e + a*c*d*e + a*b*d*e + a*b*c*e + a*b*c*d; // 分子
            int T2 = a*b*c*d*e; // 分母
            if( T1 < T2) {
              // 結果は1未満,これ以上探しても更に小さい数になるので探索終了
              break;
            }
            else if( T1 == T2) { // T1 / T2 = 1
              int s = a+b+c+d+e;
              ps( "%4d %3d %3d %3d %3d %3d\n", s, a, b, c, d, e);
              if( sum == 0) {   // 最初の結果
                A = a; B = b; C = c; D = d; E = e; sum = a+b+c+d+e;
              }
              else if( a+b+c+d+e < sum) { // 2個目以降は合計値が小さいものを記録する
                A = a; B = b; C = c; D = d; E = e; sum = a+b+c+d+e;
              }
            }
          }
        }
      }
    }
  }
  if( sum != 0) {
    ps( "Find\n");
    ps( "%4d %3d %3d %3d %3d %3d\n", sum, A, B, C, D, E);
  }
  return    0;
}