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