次の□の中にそれぞれ+−×÷のいずれかを入れて、式を完成させなさい。
1□2□3□4□5□6□7□8□9=100
さて、1+2+3+4=10だとか、1から10まで全部足せば55とかは、計算しなくても記憶の隅にあった。1から6まで足すと21。7までなら28。ところで、8×9=72。なぁんだ、1+2+3+4+5+6+7+8×9=100でいいじゃないの! 一生懸命÷をどう使おうかと考えていた人はずっこけていた。(笑)
まあ、小学生の問題だからこの程度でいいのだが、こうなるともっと色々探してみたくなる。とにかく、一番難しそうな÷を使った式を作ってしまおう。まず、答えが整数なのだから、5または7で割ることは考えられない。何かで割った場合には、その倍数を掛けなければ結果が整数にならないからである。では、分数どうし加減して、結果が整数になるのはどうか。1÷2にすると、あとが続かない。2÷3と4×5÷6を組み合わせても、どうにも上手く行かない。やはり普通に考えて、3×4×5÷6=10をモジュールにしてみよう。そうか、1+2+3+4+5+6=21だが、1+2×3×4×5÷6も21じゃないか。出来た出来た。1+2×3×4×5÷6+7+8×9=100。(=^^=)v
割り算は置いといて、寝転んで紙に色々と書き付けているうちに、更にいくつか見つかったが、こうなると、全部確かめないと気が済まなくなる。(=^^=;;
BASICが動く機械が手許にないので、もうこれしかあるまい。ExcelのVBAである。(爆)
Sub Macro1()
'
' Macro1 Macro
' マクロ記録日 : 2003/3/1 ユーザー名 :(=^^=)
'
Dim i(9), k$(4)
i(0) = 1
i(9) = 1
k$(1) = "+"
k$(2) = "−"
k$(3) = "×"
k$(4) = "÷"
r = 0
For i1 = 1 To 4
For i2 = 1 To 4
For i3 = 1 To 4
For i4 = 1 To 4
For i5 = 1 To 4
For i6 = 1 To 4
For i7 = 1 To 4
For i8 = 1 To 4
i(1) = i1
i(2) = i2
i(3) = i3
i(4) = i4
i(5) = i5
i(6) = i6
i(7) = i7
i(8) = i8
a = 0
c = 0
10 c = c + 1
If c = 10 Then GoTo 100
b = (3 - i(c - 1) * 2) * c
50 If i(c) < 3 Then GoTo 11
If i(c) = 3 Then GoTo 13
If i(c) = 4 Then GoTo 14
11 a = a + b
GoTo 10
13 b = b * (c + 1)
12 c = c + 1
If c = 10 Then GoTo 100
GoTo 50
14 b = b / (c + 1)
GoTo 12
100 If a <> 100 Then GoTo 999
r = r + 1
s$ = "1"
For j = 1 To 8
s$ = s$ + k$(i(j)) + Str$(j + 1)
Next j
Cells(r, 1) = s$
999 Next i8
Next i7
Next i6
Next i5
Next i4
Next i3
Next i2
Next i1
End Sub
どうしてこんなに汚いプログラムになったかというと、VBAのバグ(?)で、For i(1)=1 To 4が使えない(配列変数を別個に扱わない)ため、余計な式が増えたのである。それから、加減よりも乗除を優先させるアルゴリズムを私は知らない。そこで、取り敢えずアキュミュレータ(A)とBレジスタとカウンタ(C)を用意し(爆)、無理矢理場合分けして計算して行ったのである。
フローチャートの書き方なんか習ったことはないから、いつものように頭の中で考えて、一気にプログラムを書き下ろした。普通ならバグって破綻するのだが、珍しく一発で動いてしまった(上述の、配列変数でループを回せない件の修正を除いて)。
これだけのややこしいことを65536回計算するのだから、かなり時間が掛かるだろうと覚悟していて、駄目なら一旦停めて、5と7で割る計算は省略したり、判断文を掃除したりしようと考えていた。ところが、砂時計が表示されるまでもなく、プログラムは一瞬で終了した。私はてっきり、どこかにエラーがあってすぐに終わったのだと思っていた。しかし、Excelのシートには、次の15本の式が表示されていたのであった。
1+ 2+ 3+ 4+ 5+ 6+ 7+ 8× 9
1+ 2+ 3− 4× 5+ 6× 7+ 8× 9
1+ 2− 3× 4+ 5× 6+ 7+ 8× 9
1+ 2− 3× 4− 5+ 6× 7+ 8× 9
1+ 2× 3+ 4× 5− 6+ 7+ 8× 9
1+ 2× 3× 4× 5÷ 6+ 7+ 8× 9
1− 2+ 3× 4× 5+ 6× 7+ 8− 9
1− 2+ 3× 4× 5− 6+ 7× 8− 9
1− 2× 3+ 4× 5+ 6+ 7+ 8× 9
1− 2× 3− 4+ 5× 6+ 7+ 8× 9
1− 2× 3− 4− 5+ 6× 7+ 8× 9
1× 2× 3+ 4+ 5+ 6+ 7+ 8× 9
1× 2× 3− 4× 5+ 6× 7+ 8× 9
1× 2× 3× 4+ 5+ 6+ 7× 8+ 9
1× 2× 3× 4+ 5+ 6− 7+ 8× 9
そうか、うっかりしていた。Pentium4は、学生の頃よく一人で占領して使っていたスーパーミニコン(32ビット)と比べると桁違いに速く、当時の通常の大型計算機を凌駕するほどの性能を持つのであった。
ところで、三連星さんがこんなのを考えた。□に何も入れないのもありなら、123−45−67+89=100。なるほど。