2008年11月28日 星期五

技藝競竇97年模擬試題參考答案 Q5


' Problem5:糊塗情報員(16%)
' 有一位間諜,依他所屬情報單位要求編碼的方式,將他所收集到情報全部編成數字碼。但他認為這樣還是不夠安全,
' 因此他再將這些數字字串,隨意切割成好幾個整數,然後將每個整數用一個數學算式來表示。這些算式只用了加、減、
' 乘三種運算子,而且每個運算元都是正整數。最後,他為了讓他自己更為心安,他將整個密碼分成兩本密碼簿儲存。密
' 碼本A 存放這些數學算式,但他將算式內的所有括號全部拿掉,然後再將這些拿掉的括號資訊記錄在密碼本B 裡面。
' 過了不久,這個間諜發現他把密碼本B 弄丟了,再加上他的記憶力不好,很多情報內容根本記不得,所以現在沒了
' 密碼本B 幾乎束手無策。在不得已的情況下,他的情報單位派了幾位心理與腦神經專家詢問他,希望能喚起他腦海內的
' 記憶。這些專家試了好幾天,用盡各種辦法後,終於承認他的記憶力果真很差,怎麼也問不出情報內容。倒是心理學專
' 家有一發現,即這位情報員在寫密碼算式時,傾向於將括號加在那些會讓算式得最大值的位置。例如5*7+2 這個算式,
' 有兩種括法:((5*7)+2)以及(5*(7+2)),第二種括法所得的值較大。請寫一程式,算出這些算式的可能最大值。
' 輸入說明:
' 每一筆輸入資料為一行算式,運算子只有三種,即一般的加、減、乘三種二元運算子,分別以符號' +' 、' -' 、' *'
' 表示。每一個運算元都是一個正整數( ≤ 100),運算元和運算子之間不會有空白,一行算式不會有超過50 個運算元。
' 輸出說明:
' 相對於每一輸入算式,輸出所有可能運算結果的最大值。該值都會是一個正整數,而且不會超過2147483647。
' 輸入範例:
' 5*7+2
' 6*3-9*3
' 5+2-7*2-3
' 範例輸出:
' 45
' 27
' 14



Public Class Form1
Dim resultStr = ""
Dim str1 As String
Dim ans As Integer
Dim ans1 As Integer

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Hide()
Dim fileContents As String
fileContents = My.Computer.FileSystem.ReadAllText(Application.StartupPath & "\Test5.txt")
Dim recArray() = Split(fileContents, vbNewLine)
Dim recIndex = 0
While recArray(recIndex) <> ""
Dim str1 = recArray(recIndex)
proc_one_rec(str1)
recIndex = recIndex + 1
End While

MsgBox(resultStr)
'My.Computer.FileSystem.WriteAllText(Application.StartupPath & "\result5.txt", resultStr, False)
End
End Sub
Sub proc_one_rec(ByVal str1)
'由左而右
ans = Val(Mid(str1, 1, 1))
listStr(str1, 2)
'由右而左
ans1 = Val(Mid(str1, Len(str1), 1))
listStr1(str1, Len(str1) - 1)
Dim ansBig = IIf(ans > ans1, ans, ans1)
resultStr = resultStr & ansBig & vbNewLine
'MsgBox(ansBig & " " & ans & " " & ans1)
End Sub

Sub listStr(ByVal str1, ByVal n)
If n = Len(str1) - 1 Then
Dim op = Mid(str1, n, 1)
Dim opN = Mid(str1, n + 1, 1)
ans = Microsoft.VisualBasic.Switch(op = "+", ans + opN, op = "-", ans - opN, op = "*", ans * opN)
Else
Dim op = Mid(str1, n, 1)
Dim opN = Mid(str1, n + 1, 1)
ans = Microsoft.VisualBasic.Switch(op = "+", ans + opN, op = "-", ans - opN, op = "*", ans * opN)
listStr(str1, n + 2)
End If
End Sub

Sub listStr1(ByVal str1, ByVal n)
If n = 2 Then
Dim op = Mid(str1, n, 1)
Dim opN = Mid(str1, n - 1, 1)
ans1 = Microsoft.VisualBasic.Switch(op = "+", opN + ans1, op = "-", opN - ans1, op = "*", opN * ans1)
Else
Dim op = Mid(str1, n, 1)
Dim opN = Mid(str1, n - 1, 1)
ans1 = Microsoft.VisualBasic.Switch(op = "+", opN + ans1, op = "-", opN - ans1, op = "*", opN * ans1)
listStr1(str1, n - 2)
End If
End Sub
End Class

沒有留言: