2011年10月17日 星期一

96模擬 Problem 4 (數學遊戲

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

2 則留言:

  1. 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

    回覆刪除
  2. 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

    回覆刪除