1+2+3+4+5+6+7+8×9=100


 先日、妖怪仲間の某夫人が、小学生の娘の算数の宿題が分からないとチャットルームで発言し、みんな難しい、分からないと騒いでいた。その問題とは、

 次の□の中にそれぞれ+−×÷のいずれかを入れて、式を完成させなさい。
 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。なるほど。



ITバブルを茶化すコーナー    化け猫屋敷に戻る   化け猫屋敷掲示板(=^^=)m   級シスアド連盟