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