朝日新聞2006年6月2日パズル横丁解答

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

Find 001 => 001
Find 002 => 002
Find 003 => 003
Find 035 => 053

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

#include "puzutl.h"

int cmpc( const void* va, const void* vb) { // 文字列内の文字ソート用
  char a = *(const char*)va,  b = *(const char*)vb;
  return    a-b;
}

void threecmp( int ia, int ib) 
{
  char a[4], b[4];
  sprintf( a, "%03d", ia);
  sprintf( b, "%03d", ib);
  qsort( a, 3, sizeof(char), cmpc); // 使っている数字を小さい順に並べ替える
  qsort( b, 3, sizeof(char), cmpc);
  if( !strcmp(a,b)) {           // 同じ数字を使っているか?
    ps( "Find %03d => %03d\n", ia, ib);
  }
}

int main( int argc, cstring argv[])
{
  int iok = 1;
  for( int i=1; i< 1000; i++) {
    int a[3] = { (i/100)%10, (i/10)%10, i%10};
    if( a[0] == 4 || a[0] == 9 ||
        a[1] == 4 || a[1] == 9 ||
        a[2] == 4 || a[2] == 9) { // NG
    }
    else {                      // OK
      threecmp( iok, i);        // 3つの数字を比較する
      iok++;
    }
  }
  return    0;
}