朝日新聞2005年7月1日パズル横丁解答

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

タナバタ×タナバタ=□□□□□ナバタ
5625×5625=31640625

タナバタ×タナバタ×タナバタ=□□□□□□□□タナバタ
5625×5625×5625=177978515625

(2005.7.16)私は「タナバタ」がセットで問題かと思っていたら,昨日の新聞の解答欄を見ると,「ナバタ」に376を割り当てるのも正解ということだ。下のソースファイルは「ナバタ」=376には対応していない。

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

#include "puzutl.h"

void prn( int64 a)
{
  int n[64];
  int i=0;
  while( a != 0) {
    n[i++] = a%10;
    a /= 10;
  }
  while( i--> 0) {
    ps( "%-.2s", "0123456789"+n[i]*2);
  }
}
void prans( int a)
{
  int A = a;
  int ta = a % 10; a /= 10;
  int ba = a % 10; a /= 10;
  int na = a % 10; a /= 10;
  int TA = a % 10; a /= 10;

  // 条件に当てはまらないものは解にあらず。
  int use[10] = {0};
  if( ta != TA) return;
  if(use[ta]++) return;
  if(use[ba]++) return;
  if(use[na]++) return;

  // 答えを出力する。
  ps( "タナバタ×タナバタ=□□□□□ナバタ\n");
  prn( A); ps( "×"); prn( A); ps( "="); prn( A*A); ps( "\n\n");

  ps( "タナバタ×タナバタ×タナバタ=□□□□□□□□タナバタ\n");
  prn( A); ps( "×"); prn( A); ps( "×"); prn( A); ps( "="); prn( (int64)A*A*A); ps( "\n");
}

int main( int argc, cstring argv[])
{
  for( int tanabata=1000; tanabata< 10000; tanabata++) {
    int   tanabata2 = tanabata*tanabata;
    int64 tanabata3 = (int64)tanabata*tanabata*tanabata;
    if( (tanabata%1000) == (tanabata2%1000) && (tanabata3%10000) == tanabata) {
      prans( tanabata); // まだ解候補の段階
    }
  }
  return    0;
}