[概要]
アメリカから日本行きの飛行機に乗った時に、
13時間というフライト時間をとっても持て余しました。
機内誌を見たところクイズが載っていたのですが、
やってみたところ大変面白かったので、ここに載せてみることにします。
(QUIZ) 以下の式に対し、0〜9の数字を1つづつ使用して完成させてください。
※4は既に使用しているため、使えません。。。
4 | ? | ? | ||
× | ? | ? | ||
- | - | - | - | - |
? | ? | ? | ? | ? |
[ダウンロード]
問題を解くプログラムを作ってみました。
0〜9(4を除く)の順列を生成して、力ずくで計算しているだけですが。。。
Calc2.zip[1.92KB]
[使い方]
java Main
[考え方]
以下のはかなり力ずくです(^^;
もっと良いやり方をご存知の方はお知らせいただけると幸いです。
4 | (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)にも重複が生じないかどうか確かめます。