プログラムの実行結果は以下の通り。
解:7 cnt:362880
結果を図示すると以下のようになる。

他の部分は組合せが複数ある。例えば以下の通り。

今回は灰色部分だけを求める問題で,他の部分は組合せが複数あるので,それらを出力するようにプログラムを作成しなかった。
ソースは以下の通り。
#include "puzutl.h"
YesNo used[10];
YesNo find[10]; // 出現した数字
int main( int argc, cstring argv[])
{
int cnt = 0;
for( int a=1; a< 10; a++) {
used[a] = YES;
for( int b=1; b< 10; b++) {
if( used[b]) continue;
used[b] = YES;
for( int c=1; c< 10; c++) {
if( used[c]) continue;
used[c] = YES;
for( int d=1; d< 10; d++) {
if( used[d]) continue;
used[d] = YES;
for( int e=1; e< 10; e++) {
if( used[e]) continue;
used[e] = YES;
for( int f=1; f< 10; f++) {
if( used[f]) continue;
used[f] = YES;
for( int g=1; g< 10; g++) {
if( used[g]) continue;
used[g] = YES;
for( int h=1; h< 10; h++) {
if( used[h]) continue;
used[h] = YES;
for( int i=1; i< 10; i++) {
if( used[i]) continue;
used[i] = YES;
int x = a*b*c*d;
int y = e*f*g*h;
int z = i;
if( x % y == 0 && x / y + z == 17) {
//ps( "Find (%d*%d*%d*%d)/(%d*%d*%d*%d)+%d=17\n", a, b, c, d, e, f, g, h, i);
find[z] = YES;
}
cnt++;
used[i] = NO;
}
used[h] = NO;
}
used[g] = NO;
}
used[f] = NO;
}
used[e] = NO;
}
used[d] = NO;
}
used[c] = NO;
}
used[b] = NO;
}
used[a] = NO;
}
for( int z=1; z<= 9; z++) {
if(find[z]) ps( "解:%d\n", z);
}
ps( "cnt:%d\n", cnt);
return 0;
}