2012年7月20日 星期五

傳統數學問題的解決(99模擬) -1

子題1:給定若干個數字,將它們依序排成一個頭、尾相接的環形。如果我們從某一數字開始點名,每次點名後再往後跳2 個數字繼續點名(中間間隔1 個未被點名的數字)。已經被點到名的數字不可再點,直到剩下最後一個「未點名」的數字時才停止。請問最後的數字為何?

輸入說明:
第1 行依序給定最多20 個要點名的數字,各數字之間以逗號隔開。
第2 行有1 個數字,是「開始點名」的數字。

輸出說明:
第1 行輸出最後一個未點名的數字。

輸入範例:【檔名:in-5-1.txt】
5, 3, 7, 11, 4, 2, 1, 8, 9
8

輸出範例:【檔名:out-5-1.txt】
9

6 則留言:

  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
    Line Input #1, x
    a = Split(x, ",")
    Input #1, n
    For i = 0 To UBound(a)
    List1.AddItem a(i)
    If Val(a(i)) = n Then b = i
    Next
    Do
    List1.RemoveItem (b)
    b = (b + 1) Mod List1.ListCount
    Loop Until List1.ListCount = 1
    Print #2, List1.List(0)
    Close
    Close
    End
    End Sub

    回覆刪除
  2. Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Dim x() As Integer
    Line Input #1, n1
    Input #1, n2
    a = Split(n1, ",")
    b = UBound(a)
    ReDim x(b)
    For i = 0 To b '這裡不知道這樣寫會不會比較不好
    x(i) = Val(a(i)) '主要是想把題目的陣列改成數值
    If x(i) = n2 Then c = i
    Next i

    Do Until k = b
    x(c) = 0: k = k + 1
    For d = 1 To 2
    If x((c + 1) Mod (b + 1)) = 0 Then
    d = d - 1
    End If
    c = (c + 1) Mod (b + 1)
    Next d
    Loop
    For ii = 0 To b
    If x(ii) <> 0 Then Print #2, x(ii)
    Next ii
    Close #2
    Close #1
    End
    End Sub

    回覆刪除
  3. 小冰好,
    你這題和之前我提過的另一題有個同樣的問題,
    你用的是「後測式迴圈」,表示至少會執行一次。
    那麼,如果一開始就只剩下一個呢?這不算是輸入錯誤哦。
    所以,還是應該用「前測式迴圈」。
    哲好,
    你在前面將陣列改成數值,可以,但是,沒有幫助到。(有點兒多些一舉,但是沒錯)。
    你在這Do Until k = b這行之前,並沒有給定k的值,用預設值0,並不是很好的方式,這兒反而該先給它個值的。
    除掉和小冰一樣的輸入的陣列只有1個的狀況,你和小冰的程式,都算是正確的。
    **
    大家再加油。

    熊掌 還在巴黎

    回覆刪除
  4. 小冰、哲好,
    昨天小小看錯,再加回一下。
    小冰的方式,用listbox的方式是很好的。當然,只有一個輸入項的情形,也是要提防的,不然應該是會出現錯誤執行的,那個迴圈條件不會到達。
    而哲的方式,想用陣列來做,是可以的。但是,
    需要用兩個陣列,一個存原來的數值(或字串,都行),一個存是否被「拜訪」過。
    你用0來表示走過了,是危險的,要是數字中是有個0的呢?
    **
    在陣列中,想移除一個項目是困難的,但是,剛好,listbox這個可以當陣列使用,又可以排序,又可以移除某項目的,是個好用的方式,可以多多利用。
    反正在執行時,不會讓listbox讓人家看到,是用「物件」當成好用的「陣列」。

    熊掌 清醒的巴黎早晨,咖啡+可頌。

    回覆刪除
  5. Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Line Input #1, x
    a = Split(x, ",")
    Input #1, n
    For i = 0 To UBound(a)
    List1.AddItem a(i)
    If Val(a(i)) = n Then b = i
    Next
    Do Until List1.ListCount = 1
    List1.RemoveItem (b)
    b = (b + 1) Mod List1.ListCount
    Loop
    Print #2, List1.List(0)
    Close
    Close
    End
    End Sub

    所以將後測改成前測就好嗎?

    回覆刪除
  6. Dim b() As Integer
    Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Line Input #1, x
    Input #1, n
    a = Split(x, ",")
    ReDim b(UBound(a))
    For i = 0 To UBound(a)
    If a(i) = Val(n) Then b(i) = 1: r = i
    Next i
    Do
    For i = r To UBound(a)
    If b(i) = 0 Then q = q + 1
    If q = 2 Then b(i) = 1: q = 0
    r = 0
    Next i
    For j = 0 To UBound(b)
    If b(j) = 0 Then ans = ans + 1: z = j
    Next j
    If ans = 1 Then Exit Do
    ans = 0
    Loop
    Print #2, a(z)
    Close #2
    Close #1
    End
    End Sub

    回覆刪除