Problem 4 (數學遊戲 18%)
在英國有一個數學遊戲,給參賽者一些正整數和一個目標數,參賽者必須在這些正整數間插入+、-、*或 / 的符號,使得最後計算的結果等於目標數。計算的方式是由左到右,而且不必管運算的優先順序(就是不管先乘除後加減那一套)。
在這個數學運算式中,有三個限制:
1. 正整數出現的次序不可改變,也就是說要與輸入的順序相同。
2. 因為目標數也是一個正整數,所以在運算的過程中,你只有在可以整除的情況下,才可以使用除法。
在運算的過程中,如果你用某一個運算符號,會導致產生的數超出-32000 ~ +32000的範圍,那麼你不可以採用此運算符號(也就是說,在運算的過程中都不允許有超出範圍的數出現)。
輸入說明:輸入檔案的第一列是1個整數n,代表接下來有多少組測試資料。每組測試資料一列。每列的第一個整數 p(0 < p 100),代表要做運算的數有多少個。接下來有p個正整數,每列的最後一個數(即p+1個)為目標數。所有的數都小於32000,而每個數字間以一個空格分開。(請參照輸入範例)
輸入範例:test4.txt
3
3 5 7 4 3
2 1 1 2000
5 12 2 5 1 2 4
輸出說明:每列測試資料輸出一列運算式,使得輸入的p個正整數運算的結果等於目標數。如果找不到這樣的運算式,請輸出『無解』。如果有多組運算式可以達成任務,請輸出任何一組均可。(請參照輸出範例)
輸出範例:result4.txt
5+7/4=3
無解
12-2/5*1*2=4
Dim n, s, t, ub, FF, Ans
回覆刪除Private Sub Form_Load()
Me.Hide
FF = Split("+ - * /")
Open App.Path & "\in.txt" For Input As #1
Open App.Path & "\out.txt" For Output As #2
Input #1, t
For i = 1 To t
List1.Clear
Line Input #1, s
n = Split(s)
ub = UBound(n) - 2
Call A1("", 0)
Call A2
Next
Close
Close
End
End Sub
Sub A1(a, b)
If b = ub Then
List1.AddItem a
Else
For i = 0 To 3
Call A1(FF(i) & " " & a, b + 1)
Next
End If
End Sub
Sub A2()
For i = 0 To List1.ListCount - 1
Dim OP
OP = Split(List1.List(i))
Ans = n(1)
For j = 2 To UBound(n) - 1
m = (j - 2)
Select Case OP(m)
Case "+": Ans = Val(Ans) + Val(n(j))
Case "-": Ans = Ans - n(j)
Case "*": Ans = Ans * n(j)
Case "/": Ans = Ans / n(j)
End Select
Next
If Val(Ans) = Val(n(UBound(n))) Then Call A3(i): Exit Sub
Next
Print #2, "無解"
End Sub
Sub A3(a)
Dim AP, P
P = Split(List1.List(a))
AP = n(1)
For j = 2 To UBound(n) - 1
m = (j - 2)
AP = AP & P(m) & n(j)
Next
AP = AP & "=" & n(UBound(n))
Print #2, AP
End Sub
Dim X()
回覆刪除Dim ans
Private Sub Form_Load()
Me.Hide
Open App.Path & "\in.txt" For Input As #1
Open App.Path & "\out.txt" For Output As #2
ans = 0
Input #1, N
For i = 1 To N
Input #1, N2
ReDim X(N2)
For j = 1 To N2
Input #1, X(j)
Next j
Input #1, ans
List1.Clear
Call ABC(N2, 1, "", X(1))
If List1.ListCount >= 1 Then Print #2, List1.List(0) & "=" & ans Else Print #2, "無解"
Next i
Close #2
Close #1
End
End Sub
Sub ABC(A, B, C, D)
If A = B Then
C = X(1) & C
If D = ans Then List1.AddItem C
Else
Call ABC(A, B + 1, C & "+" & X(B + 1), D + X(B + 1))
Call ABC(A, B + 1, C & "-" & X(B + 1), D - X(B + 1))
Call ABC(A, B + 1, C & "*" & X(B + 1), D * X(B + 1))
If D Mod X(B + 1) = 0 Then Call ABC(A, B + 1, C & "/" & X(B + 1), D / X(B + 1))
End If
End Sub
in.txt-----------
3
3 5 7 4 3
2 1 1 2000
5 12 2 5 1 2 4
out.txt----------
5+7/4
無解
12+2-5-1/2