100 人圍成一圈,順時針方向依序從 1 排到 100 號,遊戲開始從 1 號玩家開始淘汰,被淘汰者就移走,然後順時針方向跳過 1 個人,換 3 號玩家被淘汰,再來跳過 2 個人,換 6 號玩家被淘汰,就這樣順時針方向進行,每次增加 1 個人跳過,然後淘汰一個人。
請問最後一位生存者是幾號?
這一題是 Andy 自己想的,又是一題圓周類型問題。
圓冪定理
-
圓冪定理包括相交弦定理,割線定理,切割線定理。 相交弦定理 切割線定理 資料來源:
https://zh.wikipedia.org/zh-tw/%E5%9C%86%E5%B9%82%E5%AE%9A%E7%90%86
1 天前
31
回覆刪除正解,請問你採用何種方法解出?
刪除用程式語言求出
回覆刪除1. 此題不適合用 C 語言求解,
原因主要是陣列刪除一個元素是將該元素設為零, 陣列個數不變, 如果陣列個數也要跟著減一, C 語言處理起來會很困難
2. 這也算是 C 語言 的缺點, 也可不算是 C 語言 的缺點
因為每種程式語言都有其特定使用之處, 如 FORTRAN 適合於計算方面, COBOL 適合於商業方面
剛好 C 語言不適合於這類題目
3. 使用 Excel VBA 求解,
Excel VBA 刪除一個元素不是將該元素設為零, 而是刪除, 陣列個數也跟著減一
刪除動作執行99次, 剩下的一個元素就是答案
程式如下:
Sub Button1_Click()
Dim HundredNumbers As New Collection
Dim i, j, k As Integer
k = 1
For i = 1 To 100
HundredNumbers.Add i
Next
For j = 0 To 98
k = k + j
If k <= HundredNumbers.Count Then
HundredNumbers.Remove k
Else
Do Until k <= HundredNumbers.Count
k = k - HundredNumbers.Count
Loop
HundredNumbers.Remove k
End If
Next
MsgBox "HundredNumbers.count= " & HundredNumbers.Count
MsgBox "HundredNumbers.item[1]= " & HundredNumbers(1)
End Sub
謝謝你分享程式碼,這題我是用 Python 求解,Python 範例。
刪除其實這程式設計關鍵在資料結構,不管何種程式語言,陣列的長度是不可變的,本題不容易以陣列解題,可是使用 List 串列清單,可以輕易將資料從清單中插入或刪除,所以我用 List 解題。
對了,這題倖存者隱藏著一個數列,不知能有興趣一起申請 OEIS?