小町算5                                  戻る

 次の空所には数字の 1 、2 、3 、4 、5 、6 、7 、8 、9 の何れかがそれぞれ
一つずつ入る。

          

 等式が成り立つようにするには、どのように入れたらよいであろうか?

































(答) たとえば、次のように入れればよい。 

 当HPがいつもお世話になっている らすかる 様より、上記の解は全部で、824通りある
旨、メールを頂戴しました。(平成16年12月12日)

 その計算結果は、
             1+2×5−7−8÷4−3÷9×6=0
             1+2×5−7−8÷4−6÷9×3=0
             1+2×5−8−4÷6−3÷9×7=0
               ・・・・・ 途中、省略 ・・・・・
             9+8×1−5−6÷4−7÷2×3=0
             9+8×4−3−6÷2−5÷1×7=0
             9+8×4−3−6÷2−7÷1×5=0
となるそうです。

 計算結果をお寄せいただいた らすかる 様に感謝いたします。

 でも、824個も解があるということは、これは、パズルになりませんでしたね!?


(追記) その後、らすかる 様の研究によれば、四則演算子(+、−、×、÷)をいろいろ
    組み合わせてみたとき、起こりうる全ての場合の数 65536通りのうち、解をもつ
    場合が 40874通りあるとのことである。

     しかも、各場合について、解の個数に注目した場合、最大は、12960個、最小は、
    4個であるらしい。

  解の個数が最大となるパターン : 「+」が3個、「−」が4個、「×」が1個を使う場合

           このような場合は全部で、8!/(3!4!1!)=280(通り) 存在する。

  解の個数が最小となるパターン : 「×」が1個、「÷」が4個を使う場合

   たとえば、
          

   のような場合は、かけ算の入れ替えと割る数同士の入れ替えを考えれば、解は実質
   的に、1個しかないとのことである。(こちらを出題すべきでした!.....(^-^;) )

    答の一つとして、 ×÷÷÷÷ がある。

   らすかる 様によれば、次のような場合も面白そうだとのことである。
   (解は全て実質的に、1個しかないそうです。是非、チャレンジしてみて下さい。)

          


          


          




(追々記) 上記の答を記しておきます。この問題は、かなり頭の体操になりますね!

      2×5−9+4÷3÷8−7÷1÷6=0

      9÷2÷3÷6−5÷1÷4+8−7=0

      1×2×5×7+4−8×9−6÷3=0

  一番上と一番下は手計算で何とか求められたのですが、真ん中のものはちょっと
 Excel にお手伝い頂きました。(しばらくの間、解の探求に没頭してしまった!)

  そのとき用いた VBA は、公開するのも恥ずかしい位、拙いものですが......。

Sub 小町算()
Dim a, b, c, d, e, f, g, h, i As Integer
Range("a2").Select
For a = 1 To 9
For b = 1 To 9
For c = 1 To 9
For d = 1 To 9
e = 1
f = 4
g = 2
h = 3
i = 6
With ActiveCell
.Value = a
.Offset(0, 1).Value = b
.Offset(0, 2).Value = c
.Offset(0, 3).Value = d
.Offset(0, 4).Value = -a / (e * f) + b / (g * h * i) + c - d
.Offset(0, 5).Value =a + b + c + d + e + f + g + h + i
If .Offset(0, 4).Value > -1 And .Offset(0, 4).Value < 1 And .Offset(0, 5).Value = 45 Then
.Offset(1, 0).Select
Else
.Offset(0, 0).Select
End If
End With
Next d, c, b, a
End Sub


 上記の If 文で、「.Offset(0, 4).Value=0 」としてしまうと、Excel の特性から検出されな
い場合があるということで、ちょっと工夫しています。

 計算結果から、-a / (e * f) + b / (g * h * i) + c - d の値で、0 に近いものを探そうと思
ったのですが、ぴったり、0 になる場合がありました。それが上記の解です。


(追記) 平成23年10月20日付け

 当HPの読者の方から、上記VBAの改良版をご教示頂いた。わずか3分あまりで6万件
近い数式が得られることに感動しました!PDFファイルにしてアップしようと思いましたが、
1メガbyteを超えるサイズなので断念しました。ご教示いただきありがとうございました。

 Excel 2000 〜 2003 対応です。Sheet1 という名前のシートがあること。
 2.8GHz Pentium-4 のパソコンで、3分弱かかります。


Sub 小町算_2()

Dim a As Integer, b As Integer, c As Integer
Dim d As Integer, e As Integer, f As Integer
Dim g As Integer, h As Integer, i As Integer
Dim n1 As Long, n2 As Long
Dim s As String
Dim a1(2), a2(5), a3(5), a4(5), a5(5), a6(5), a7(5), a8(5), a9(5)

Dim Start As Single, Finish As Single, Tm As Integer
Dim msg_Tm As String, moto As Variant

moto = Application.DisplayStatusBar
Application.DisplayStatusBar = True

Start = Timer

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) = "/"

Application.ScreenUpdating = False

With Sheets("Sheet1")

.Columns("A:E").ClearContents

.Cells(1, 1).Value = "計算値"
.Cells(1, 2).Value = "計算式"
.Cells(1, 4).Value = "計算値"
.Cells(1, 5).Value = "計算式"

n1 = 2: n2 = 2

For a = 1 To 2
For b = 1 To 5
For c = 1 To 5
For d = 1 To 5

Application.StatusBar _
= "計算中 : a = " & a & " : b = " & b & " : c = " & c & " : d = " & d

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

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"

.Cells(1, 3).Formula = s

If .Cells(1, 3).Value = Int(.Cells(1, 3).Value) _
And Abs(.Cells(1, 3).Value) <= 1000 Then

If .Cells(1, 3).Value >= 0 Then
.Cells(n1, 1).Value = .Cells(1, 3).Value
.Cells(n1, 2).Value = "'" & s
n1 = n1 + 1
Else
.Cells(n2, 4).Value = .Cells(1, 3).Value
.Cells(n2, 5).Value = "'" & s
n2 = n2 + 1
End If

End If

Next i, h, g, f, e, d, c, b, a

.Cells(1, 3).ClearContents

' Sort

.Range(.Cells(1, 1), .Cells(n1, 2)).Sort _
Key1:=.Range("A2"), Order1:=xlAscending, Header:=xlYes
.Range(.Cells(1, 4), .Cells(n1, 5)).Sort _
Key1:=.Range("D2"), Order1:=xlDescending, Header:=xlYes

.Cells(1, 1).Select

End With

Finish = Timer: Tm = Round(Finish - Start)

Application.ScreenUpdating = True
Application.StatusBar = False
Application.DisplayStatusBar = moto

If Tm >= 60 Then
msg_Tm = Int(Tm / 60) & "分 " & Tm Mod 60 & "秒"
Else
msg_Tm = Tm & "秒"
End If

MsgBox "お待たせしました。 (所要時間 : " & msg_Tm & ")"

End Sub