子題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
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
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
小冰好,
回覆刪除你這題和之前我提過的另一題有個同樣的問題,
你用的是「後測式迴圈」,表示至少會執行一次。
那麼,如果一開始就只剩下一個呢?這不算是輸入錯誤哦。
所以,還是應該用「前測式迴圈」。
哲好,
你在前面將陣列改成數值,可以,但是,沒有幫助到。(有點兒多些一舉,但是沒錯)。
你在這Do Until k = b這行之前,並沒有給定k的值,用預設值0,並不是很好的方式,這兒反而該先給它個值的。
除掉和小冰一樣的輸入的陣列只有1個的狀況,你和小冰的程式,都算是正確的。
**
大家再加油。
熊掌 還在巴黎
小冰、哲好,
回覆刪除昨天小小看錯,再加回一下。
小冰的方式,用listbox的方式是很好的。當然,只有一個輸入項的情形,也是要提防的,不然應該是會出現錯誤執行的,那個迴圈條件不會到達。
而哲的方式,想用陣列來做,是可以的。但是,
需要用兩個陣列,一個存原來的數值(或字串,都行),一個存是否被「拜訪」過。
你用0來表示走過了,是危險的,要是數字中是有個0的呢?
**
在陣列中,想移除一個項目是困難的,但是,剛好,listbox這個可以當陣列使用,又可以排序,又可以移除某項目的,是個好用的方式,可以多多利用。
反正在執行時,不會讓listbox讓人家看到,是用「物件」當成好用的「陣列」。
熊掌 清醒的巴黎早晨,咖啡+可頌。
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
所以將後測改成前測就好嗎?
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