2019年7月16日 星期二

訓練數學感 220 ─ 殺暴行動

https://4rdp.blogspot.com/2019/07/220.html

100 人圍成一圈,順時針方向依序從 1 排到 100 號,遊戲開始從 1 號玩家開始淘汰,被淘汰者就移走,然後順時針方向跳過 1 個人,換 3 號玩家被淘汰,再來跳過 2 個人,換 6 號玩家被淘汰,就這樣順時針方向進行,每次增加 1 個人跳過,然後淘汰一個人。

請問最後一位生存者是幾號?

這一題是 Andy 自己想的,又是一題圓周類型問題。

4 則留言:

  1. 回覆
    1. 正解,請問你採用何種方法解出?

      刪除
  2. 用程式語言求出
    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

    回覆刪除
    回覆
    1. 謝謝你分享程式碼,這題我是用 Python 求解,Python 範例
      其實這程式設計關鍵在資料結構,不管何種程式語言,陣列的長度是不可變的,本題不容易以陣列解題,可是使用 List 串列清單,可以輕易將資料從清單中插入或刪除,所以我用 List 解題。

      對了,這題倖存者隱藏著一個數列,不知能有興趣一起申請 OEIS?

      刪除