天天看點

一道趣味數學題

題目:

将+,-,*,/ 添加到 1,2,3,4,5,6,7,8,9 之間,使其構成的算式四則運算結果等于100,如: 1*2*3*4+5+6+7*8+9=100

分析:

以上算式相當于把1~9  9 個數字和 8個(+,-,*,/ )作一個特殊順序的排列,共有4^8=65536 種可能,再從中進行取舍。

代碼:

Option Explicit

Private Declare Function EbExecuteLine Lib "vba6.dll" (ByVal pStringToExec As Long, ByVal Unknownn1 As Long, ByVal Unknownn2 As Long, ByVal fCheckOnly As Long) As Long '  API

Private Function ExecuteLine(sCode As String, Optional fCheckOnly As Boolean) As Boolean

ExecuteLine = EbExecuteLine(StrPtr(sCode), 0&, 0&, Abs(fCheckOnly)) = 0

End Function

Private Function result(ByVal x As String) As Single '計算表達式的結果

ExecuteLine "dim x as single"

ExecuteLine "x= " & x

ExecuteLine "clipboard.settext x" '發送到剪切闆

result = Clipboard.GetText '從剪切闆擷取

Clipboard.Clear '清空剪切闆

End Function

Sub main() '開始計算

getall 100

End Sub

Private Sub getall(ByVal theresult As Integer)

Dim temp As Long '四進制轉換中間變量

Dim x(8) As String '獲得8個位置四則運算符

Dim op(3) As String '定義四個四則運算符

Dim i As Long, j As Integer '循環變量

Dim out As String '最終表達式

Dim all As Long, num As Integer '循環範圍和輸出計數

num = 0

op(0) = "+"

op(1) = "-"

op(2) = "*"

op(3) = "/"

all = 4 ^ 8 - 1

For i = 0 To all

temp = i

x(0) = "1.0"

For j = 1 To 8

x(j) = op(temp Mod 4) & Format(j + 1, "0.0")

temp = temp / 4

Next

out = Join(x, "")

If result(out) = theresult Then '條件判斷

num = num + 1

Debug.Print "解 " & num & ":" & vbTab & Replace(out, ".0", "") & "=" & theresult

End If

Next

If num = 0 Then Debug.Print "無解!"

If num > 0 Then Debug.Print "共 " & num & " 組解!"

End Sub

輸出:

解 1:   1*2*3*4+5+6+7*8+9=100

解 2:   1-2+3*4*5+6*7+8-9=100

解 3:   1-2+3*4*5-6+7*8-9=100

解 4:   1+2+3+4+5+6+7+8*9=100

解 5:   1*2*3+4+5+6+7+8*9=100

解 6:   1-2*3+4*5+6+7+8*9=100

解 7:   1+2*3+4*5-6+7+8*9=100

解 8:   1-2*3-4+5*6+7+8*9=100

解 9:   1+2-3*4+5*6+7+8*9=100

解 10:  1+2*3*4*5/6+7+8*9=100

解 11:  1*2*3*4+5+6-7+8*9=100

解 12:  1-2*3-4-5+6*7+8*9=100

解 13:  1+2-3*4-5+6*7+8*9=100

解 14:  1+2+3-4*5+6*7+8*9=100

解 15:  1*2*3-4*5+6*7+8*9=100

共 15 組解!