Python 約瑟夫圈問題


  • 需求:有n個人圍成一圈,順序排號, 從第1個人開始報數(從1到3),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位
  • 代碼邏輯
    • n個人,通過輸入參數n,生成一個長度為n的列表
    • 通過報數邏輯函數,只要數到3的就把那個位置相對應的列表值設置為0,同時留下的人數也要減1,直到剩下的人數為1,才退出循環
    • 通過報數邏輯函數,最后得到新的列表(只有一個值是1,其余都是0),進行循環即可
  • 代碼如下:
     1 #coding:utf-8
     2 #__author__ = 'Diva'
     3 # 用戶輸入n,n代表人數,圍成一圈,順序排號
     4 # 從第一個開始報數,1,2,3,數到3的人,退出圈子
     5 
     6 # 報數邏輯,數到3的把對應的位置置為0,直到剩下最后一個人
     7 def num_report(list_create):
     8     n = 0
     9     list_size = len(list_create)
    10     number_stay = list_size     # 剩下的人數(值為1的個數)
    11     while not number_stay == 1:
    12         for i in range(list_size):
    13             if list_create[i] == 1:
    14                 n = n + 1
    15                 if n == 3:
    16                     list_create[i] = 0
    17                     n = 0
    18                     number_stay = number_stay - 1
    19             if i == list_size:
    20                 i = 0
    21 
    22 # 通過報數函數最后生成的新的列表,遍歷,找到唯一一個值不是0的人
    23 def remove_num_3(list_create):
    24     num_report(list_create)
    25     print('經過報數邏輯最后得到的列表是:' + str(list_create))
    26     i = 0
    27     while i < len(list_create):
    28         if list_create[i] == 1:
    29             print('最后剩下的編號是:' + str(i + 1))
    30             return True
    31         i = i + 1
    32 
    33 # 根據用戶輸入的人數n,生成列表,同時執行移除動作
    34 def list_create_rm(n):
    35     try:
    36         if not n.isdigit():
    37             return False
    38     except ValueError as e:
    39         pass
    40 
    41     nn = int(n)
    42     i = 0
    43     list_create = []
    44     while i < nn:
    45         list_create.append(1)
    46         i = i + 1
    47     print('生成的列表是:' + str(list_create))
    48     remove_num_3(list_create)
    49 
    50 if __name__ == '__main__':
    51     n = raw_input('請輸入人數:')
    52     list_create_rm(n)

     

  • 測試結果
  •  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM