朝日新聞2006年7月14日パズル横丁解答

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

Find
192 x 576 = 48 ^ 3

図にすると以下のようになる。

EXCELでの結果は以下の通り。

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

#include "puzutl.h"

int pow3( int x, int y) 
{
  int z = x;
  while( --y> 0) {
    z *= x;
    if( z > 999*999) return 0;  // 解は3桁x3桁に等しくなるのでこれより大きな数は無視
  }
  return    z;
}

void check( int num[])          // num[]は1〜9までの数字が入っている
{
  for( int m=0; m< 9; m++) {    // 9回ローテートしてnum[0]に1〜9の数字全てを割り当てて調べる
    int a = num[0];             // 判りやすく文字に割り当てる
    int b = num[1];
    int c = num[2];
    int d = num[3];
    int e = num[4];
    int f = num[5];
    int g = num[6];
    int h = num[7];
    int i = num[8];
    int x = a*100 + b*10 + i;
    int y = f*100 + d*10 + e;
    int z = pow3( g*10 + c, h); // (g*10+c)**h
    if( x * y == z) {           // 計算式が等しいか?
      ps( "Find\n");
      ps( "%d%d%d x %d%d%d = %d%d ^ %d\n", a, b, i, f, d, e, g, c, h);
    }
    // num[]に入った数字をローテートする
    int tmp = num[0];
    for( int n=0; n< 8; n++) {
      num[n] = num[n+1];
    }
    num[8] = tmp;
  }
}

int main( int argc, cstring argv[])
{
  int num[9] = { 1,2,3,4,5,6,7,8,9}; // 数字は順に並んでいる
  check(num);
  int revnum[9] = { 9,8,7,6,5,4,3,2,1}; // 数字は逆順に並んでいる
  check(revnum);
  return    0;
}