经典约瑟夫环问题

  • 需求:有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)

猜你喜欢

转载自blog.csdn.net/qq_41868948/article/details/81434935