プログラムの実行結果は以下の通り。
タナバタ×タナバタ=□□□□□ナバタ 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;
}