題目:
将+,-,*,/ 添加到 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 組解!