朝日新聞2004年7月17日パズルパーク(V)解答

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

Find 11**3 - 10**3 = 331

図示すると以下の通り。

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

#include "puzutl.h"

int64 power( int x, int y)      // x**y
{
  int64 z = x;
  if( x == 0) return 0;         // 0**N = 0
  if( y == 0) return 1;         // N**0 = 1
  while( --y > 0) {
    z           *= x;
  }
  return    z;
}

int   x[1000];
int   y[1000];
int   z[1000];
int64 p3[1000];

void check( int i, int j)
{
  int used[10] = {0};
  used[x[i]]++;
  used[y[i]]++;
  used[z[i]]++;
  used[x[j]]++;
  used[y[j]]++;
  used[z[j]]++;
  if( z[i] != 3 || z[j] != 3) return; // AB**3 - DE**3 にしないと答えがいっぱい出る
  int n = 0;
  for( int k=0; k< 10; k++) {
    if( used[k]) n++;
  }
  if( n > 3) return;            // 3種類以上の数字を使用している
  int64 d = p3[i] - p3[j];
  if( p3[i] < p3[j]) return ;   // 結果が正数になるものに限定
  //  if( p3[i] == 0 || p3[j] == 0) return;
  if( d > 999) return;          // 結果は3桁
  if( d < 100) return;          // 結果は3桁
  int p = d;
  used[(p/100)%10]++;           // G の数字種類を調べる
  used[(p/10 )%10]++;
  used[(p/1  )%10]++;
  n = 0;
  for( k=0; k< 10; k++) {       // 数字種類を勘定する
    if( used[k]) n++;
  }
  if( n > 3) return;            // AB**C + DE**F = GHI で3種類以上の数字を使用している
  ps( "Find %d%d**%d - %d%d**%d = %03d\n", x[i], y[i], z[i], x[j], y[j], z[j], p);
}

int main( int argc, cstring argv[])
{
  int           n = 0;
  for( int a=0; a< 10; a++) {   // AB**C を求める
    for( int b=0; b< 10; b++) {
      for( int c=0; c< 10; c++) {
        x[n] = a; y[n] = b; z[n] = c; // AB**C を記憶する
        p3[n] = power( a*10 + b, c); // AB**C の結果を記憶する
        n++;
      }
    }
  }
  for( int i=0; i< 1000; i++) { // AB**C
    for( int j=0; j< 1000; j++) { // DE**F
      check( i, j);             // AB**C + DE**F = GHI が成立する3種類の数字を求める
    }
  }
  return    0;
}