2011年11月7日 星期一

98模擬 Problem 1 (數字刪除

給n 個數字,請你在這n 個數字中,找出所有重覆出現的數字,並把它刪除。最後計算 刪除後剩餘的數字個數。

輸入說明:
第一行的數字,表示有幾組測試資料,第二行開始即為第一筆測試資料,每行不會超過 100 個數字,每個數字之間用一個空白做為區隔,數字的範圍為[0, 10000]間的整數。

輸出說明:
對輸入的每筆測試資料,分別輸出刪除完後剩下的數字個數。

輸入範例:
2
1 2 3 4 5 6 7 8 9 2 1
2 4 6 8 10

輸出範例:
7
5

3 則留言:

  1. Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Input #1, n
    For i = 1 To n
    List1.Clear: List2.Clear
    Line Input #1, X
    Y = Split(X)
    For j = 0 To UBound(Y)
    List1.AddItem Y(j)
    Next j


    For j = 0 To (List1.ListCount - 2)
    For r = j + 1 To (List1.ListCount - 1)
    If List1.List(j) = List1.List(r) Then
    Call ABC(List1.List(j))
    End If
    Next r
    Next j

    For j = 0 To List1.ListCount - 1
    If List1.List(j) <> "X" Then List2.AddItem List1.List(j)
    Next j

    Print #2, List2.ListCount

    Next i
    Close #2
    Close #1
    End
    End Sub

    Sub ABC(A)
    For i = 0 To List1.ListCount - 1
    If A = List1.List(i) Then List1.List(i) = "X"
    Next i
    End Sub

    回覆刪除
  2. Dim s, v()
    Private Sub Form_Load()
    Me.Hide
    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
    Line Input #1, n
    s = Split(n)
    ReDim v(10000)
    Call A1
    Next
    Close
    Close
    End
    End Sub

    Sub A1()
    ans = 0
    For i = 0 To UBound(s)
    v(s(i)) = v(s(i)) + 1
    Next
    For i = 0 To 10000
    If v(i) = 1 Then ans = ans + 1
    Next
    Print #2, ans
    End Sub

    回覆刪除
  3. arro好,
    你的程式中
    v(s(i)) = v(s(i)) + 1
    所以,當重複出現時,
    If v(i) = 1 Then ans = ans + 1
    會因為v(i)>1,而不會加到ans中,滿好的想法。
    程式正確。

    柯佑好,
    你的程式做得複雜了些,也正確。這種確定數字範圍的,用arro的方式比較好。

    回覆刪除