小町算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個しかないとのことである。(こちらを出題すべきでした!.....(^-^;) )
答の一つとして、 2×3+5÷8−7÷1+9÷4÷6=0 がある。
らすかる 様によれば、次のような場合も面白そうだとのことである。
(解は全て実質的に、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