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)
- 测试结果
站在此岸链接彼岸,用高配版的自己,来带动低配版的自己。