朝日新聞2004年6月26日パズルパーク解答

ソースは以下の通り。

#include "puzutl.h"

int diff( cstring s)
{
  cstring       t = "30727582735";
  int           n = 0;
  for( int i=0; i< 11; i++) {
    if( *s++ != *t++) n++;
  }
  return    n;
}

char dec2chr(int i)
{
  return    '0' + (i%10);
}

int main( int argc, cstring argv[])
{
  int cnt = 0;
  int k;
  char buf[128];
  ProcTime      pt; pt.start();
  for( int i=1; i< 1000; i++) {
    for( int j=1; j< 1000; j++) {
      k = i*j;
      cnt++;
      if( k >= 100000) break;
      astring p = buf;
      *p++ = dec2chr(i/100);
      *p++ = dec2chr(i/10);
      *p++ = dec2chr(i);
      *p++ = dec2chr(j/100);
      *p++ = dec2chr(j/10);
      *p++ = dec2chr(j);
      *p++ = dec2chr(k/10000);
      *p++ = dec2chr(k/1000);
      *p++ = dec2chr(k/100);
      *p++ = dec2chr(k/10);
      *p++ = dec2chr(k);
      *p = NIL;
      if( diff(buf) == 2) ps( "%03dx%03d=%05d\n", i, j, k);
    }
  }
  pt.end();
  ps( "%g 秒(%d回)\n", pt.sec(), cnt);
  return 0;
}

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

301x275=82775
0.625 秒(330057回)