0〜9の数字を使って、掛け算して、Go!

[概要]
アメリカから日本行きの飛行機に乗った時に、
13時間というフライト時間をとっても持て余しました。
機内誌を見たところクイズが載っていたのですが、
やってみたところ大変面白かったので、ここに載せてみることにします。

(QUIZ) 以下の式に対し、0〜9の数字を1つづつ使用して完成させてください。
※4は既に使用しているため、使えません。。。

   
×    
- - - - -

解答は下の方にあります。

[ダウンロード]
問題を解くプログラムを作ってみました。
0〜9(4を除く)の順列を生成して、力ずくで計算しているだけですが。。。
Calc2.zip[1.92KB]

[使い方]
java Main

[考え方]
以下のはかなり力ずくです(^^;
もっと良いやり方をご存知の方はお知らせいただけると幸いです。

    (4) (1)
×     (5) (2)
- - - - -
(9) (8) (7) (6) (3)

■手順1
まず、下1桁に着目しました。
上の式の(1)×(2)の結果の下一桁が(3)となります。
ただし、以下の制約があります。

(1)(1)か(2)に0がくると、必然的に(3)も0となるため、0は使用できません。
(2)(1)か(2)に1がくると、A×1=Aにより、(1)=(3) or (2)=(3)となるため、1も使用できません。
(3)4は使用済みのため、(3)=4となるもの(7×2=14など)は当てはまりません。
(4)(1)か(2)で使用している数値が(3)となるもの(2×6=12など)は当てはまりません。

これらの制約を元に(1)、(2)、(3)の組み合わせを考えると、以下のものに絞られます。
なお、(1)と(2)は逆になることも考えられます。

(1) (2) (1)×(2) (3) 使える数字の残り
2 3 6 6 015789
2 5 10 0 136789
2 8 16 6 013579
2 9 18 8 013567
3 6 18 8 012579
3 7 21 1 025689
3 9 27 7 012568
5 6 30 0 123789
5 8 40 0 123679
6 7 42 2 013589
7 8 56 6 012359
7 9 63 3 012568
8 9 72 2 013567

■手順2
次に上1桁に着目しました。
答えが最大になる式は、476×98=46648であるため、(9)は最大で4になります。
0と使用済みの4を除くと、(9)には1〜3が当てはまることになります。

この制約に着目すると、2×3=6のパターンでは、
(9)に1しか使えないが、(5)には残りの5789のいずれを当てはめても、
(9)すなわち上1桁が2以上となるため、このパターンは消されることになります。

■手順3
さて、ここからが力ずくなところなのですが(^^;
(4)と(5)を当てはめて、(6)と(7)を計算し、数字の重複がないかどうかをひたすら検算していきます。

(6)は、以下の式で求まります。
(6) = {(1)×(5) + (2)×(4) + (1)×(2)の繰り上がり}の下一桁
(7)は、以下の式で求まります。
(7) = {(4)×(5) + (2)×4 + (6)の結果の繰り上がり}の下一桁

(5)に0か1がくると、結果が5桁にならず、(9)が0となってしまう制約を使用します。
例えば、(1)=2、(2)=9、(3)=8のパターンを考えると、(4)、(5)は以下のようなパターンが考えられます。

(4) (5) (6)の計算結果 (6) (7)の計算結果 (7) (1)〜(7)に重複がないかどうか
0 3 7 7 36 6 ok
0 5 11 1 37 7 ok
0 6 13 3 37 7 ok
0 7 15 5 37 7 (7) = (5)のため除外
1 3 16 6 40 0 ok
1 5 20 0 43 3 ok
1 6 22 2     (6) = (1)のため除外
1 7 24 4     (6) = 4のため除外
3 5 38 8     (6) = (8)のため除外
3 6 40 0 58 8 (7) = (3)のため除外
3 7 42 2     (6) = (1)のため除外
5 3 52 2     (6) = (1)のため除外
5 6 58 8     (6) = (8)のため除外
5 7 60 0 77 7 (7) = (5)のため除外
6 3 61 1 60 0 ok
6 5 65 5     (6) = (5)のため除外
6 7 69 9     (6) = (2)のため除外
7 3 70 0 64 4 (7) = 4のため除外
7 5 74 4     (6) = 4のため除外
7 6 76 6     (6) = (5)のため除外

上記で検算対象となったものに対して、実際に値を当てはめて計算し、
残りの(8)、(9)にも重複が生じないかどうか確かめます。



































































































[解答]
402 x 39 = 15678 (僕が手計算で出せた答えがこれ)
483 x 12 = 05796 (これは上1桁が0なので、答えとしては微妙かも?)
495 x 36 = 17820 (機関誌に載っていた答えがこれ)