小町算                                  戻る

 当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


(コメント) このテーマを追究して、とても面白く、ためになる経験ができた。このような機会
      を与えていただいた未菜実さんとらすかるさんに感謝したい。