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