小町算
当HPの掲示板「出会いの泉」に、いつもお世話になっている未菜実さんから、小町算の
問題が出題された。(平成17年5月13日)
問 題 1〜9 の数字をこの順で使い、下記のルール
1.演算子は、+−×/のみとする。(括弧は使わない)
2.数字の連結は認める。(12 や 567 など)
3.1の前のマイナスは認める。
に従って、1〜1000までを作る。990以外は作れることを確認したのだが、990がで
きるかどうか今のところ不明である。誰か、調べてほしいのだが?
この問いかけに、当HPがいつもお世話になっているHN「らすかる」さんが即座に調べて
くれた。
[ らすかるさんの調査結果 ]
起こりうる全ての場合の数は、 2・58=781250(通り)で、そのうち計算結果が整数に
なるものは、170204通りある。正の数及び負の数になるものがそれぞれ
84935通りで、
0になるものは、334通りある。
たとえば、12−3−4−5−6+7+8−9=0、・・・ など。
計算結果は全部で 29123種類あり、正の数および負の数は、それぞれ 14561種類
で、残りの1種類は、0 である。最大値(最小値)は、123456789(−123456789)で
ある。 −1070〜1070 の範囲の数は作れるが、数の±1071を作ることは不可能であ
る。上記の範囲で、 ±990 、±1000 、±1003 、±1062 を作る計算式は、ただ
1通りしか存在しない。
たとえば、−1×23+4×56+789=990、・・・ など。
これに対して、数の0を作る方法は 334通り 、数の±9を作る方法は 308通りある。
(コメント) 数字を変化させて計算させるプログラムを書くことは易しいが、演算子を変化さ
せて計算させるプログラムって、どうやって作るのだろう?この問題をきっかけと
して、そちらの方が実は大いに興味があるところである。
(追記) 上記の小町算の全ての場合を求めるプログラムを、Excel の VBA
で作ってみた。
Excel は行数が最大で 65536 なので、全ての場合を出力できず、いくつかに場合
分けして考えた。(下記で、a、b、c の値を指定)
本当は、全てを一つの作業で終わらせたかったのだが...。多分、プログラムに一工
夫すると、出来るのだろう。
Sub 小町算()
Dim a, b, c, d, e, f, g, h, i As Integer
Dim s As String
Dim a1(2), a2(5), a3(5), a4(5), a5(5), a6(5), a7(5), a8(5), a9(5)
a1(1) = "+": a1(2) = "-"
a2(1) = "": a2(2) = "+": a2(3) = "-": a2(4) = "*": a2(5) = "/"
a3(1) = "": a3(2) = "+": a3(3) = "-": a3(4) = "*": a3(5) = "/"
a4(1) = "": a4(2) = "+": a4(3) = "-": a4(4) = "*": a4(5) = "/"
a5(1) = "": a5(2) = "+": a5(3) = "-": a5(4) = "*": a5(5) = "/"
a6(1) = "": a6(2) = "+": a6(3) = "-": a6(4) = "*": a6(5) = "/"
a7(1) = "": a7(2) = "+": a7(3) = "-": a7(4) = "*": a7(5) = "/"
a8(1) = "": a8(2) = "+": a8(3) = "-": a8(4) = "*": a8(5) = "/"
a9(1) = "": a9(2) = "+": a9(3) = "-": a9(4) = "*": a9(5) = "/"
Range("a2").Select
a = 1
b = 1
c = 1
For d = 1 To 5
For e = 1 To 5
For f = 1 To 5
For g = 1 To 5
For h = 1 To 5
For i = 1 To 5
With ActiveCell
.Select
s = "=" & a1(a) & "1" & a2(b) & "2"
& a3(c) & "3" & a4(d) & "4" & a5(e)
_
& "5" & a6(f) & "6" & a7(g) & "7" & a8(h) & "8" & a9(i) & "9"
ActiveCell.Formula = s
.Offset(1, 0).Select
End With
Next i, h, g, f, e, d
End Sub
興味ある方は、是非上記の拙いプログラムを実行してみてください。
Excel を起動し、[ツール]−[マクロ]−[Visual Basic Editor] とクリックして
Editor
を起動し、[挿入]−[標準モジュール] を選択して、上記を記述すればよい。
後は、[ツール]−[マクロ]−[マクロ]−[実行] で、計算出力が始まる。
a、b、c の値を 1〜5 までの範囲で変化させれば、全ての場合が得られる。
(コメント) 私のパソコン(pentiumM)で、大体一つの場合につき、18秒位で計算でき
ました。したがって、全ての場合を計算するのに要した時間は、
18×2×5×5=900(秒) ・・・ 15分
でした。
(追々記) らすかるさんの調査結果で計算式が、ただ 1 通りしか存在しないという次の
場合
±990 、±1000 、±1003 、±1062
がとても気になったので、上記の出力結果から拾い出してみた。
990=−1×23+4×56+789
−990= 1×23−4×56−789
1000=−12+34×5×6−7+8−9
−1000= 12−34×5×6+7−8+9
1003= 12×3×45+6−7×89
−1003=−12×3×45−6+7×89
1062=−1+23+4×5×6×78/9
−1062= 1−23−4×5×6×78/9
また、計算結果が 0 〜 10 までについても、たくさんある計算式から一例をあげて
おこう。
0=12+34−56−7+8+9
1=12×34−5×67−8×9
2=12+3×4−5×6+7−8+9
3=12×3/4−5×6+7+8+9
4=12+3/4−5+6×7/8−9
5=12×3+45+6+7−89
6=12×3+45−6−78+9
7=12−3×4+56/7+8−9
8=12×3/4−5−6−7+8+9
9=12/3+4+5+6+7−8−9
10=12−3/4−5−6×7/8+9
(コメント) このテーマを追究して、とても面白く、ためになる経験ができた。このような機会
を与えていただいた未菜実さんとらすかるさんに感謝したい。