[パズル]センチュリーパズル (西洋小町)

1〜9までの数字を1回だけ使って帯分数をつくり、 その値が100をを表すようにするパズルをセンチュリーパズル(世紀パズル)と言います。

別の表現だと、「K + N / D = 100」を満たす K,D,Nを求めよ。ただし、K,N,Dは1〜9の数を1つずつ使用すること、となります。

例えば、
 3 + 69258 / 714 = 100
となり、求める答えの一つです。

欧米で知られている小町数パズルのひとつです。(小町: 1-9が一つずつで構成されている)

※ ボタンを押すと、解が表示されます。

[パズル]3つの式が等しくなる小町数では、再帰処理をし1-9の順列を求めることで解を求めました。このセンチュリーパズルも同様の手法が使えますが、ここでは別のアプローチを取ることにします。
K + N / Dのそれぞれが、正の数であることから、Kは、1から99までの値に絞られます。
つまり、

 for (int k = 1; k <= 99; k++) {
     ...
 }

というループの中で、N,D を求めてゆけば良いことになります。
k=3の場合を考えてみると、N/Dは、97になるので、
97/1, 194/2, 291/3, 388/4, 485/5,...
と調べてゆき、K,N,Dが1-9で構成されていれば、求める答えになります。N,Dは桁数がどんどん増えてゆきますから、K, N,Dの桁数の合計が10桁以上になったら、小町を満たさなくなりますので、Kの処理を終わります。
このパズルは再帰処理を使わないので、容易に理解できると思います。

これをC#のコードにしたのが、以下のコードです。

■Solver.cs

■MainPage.xaml.cs

■MainPage.xaml