遇到一个python循环题目:有N个人(编号为1-N)围成一个圈,从编号为1的人开始报数,报数的范围是1~M,报到M的人出圈,下一个人重新从1开始报数,直到留下最后一个人,问最后一个人的编号是多少?
答:这是一个循环的问题,解决的问题主要有:
1,需要将报到数为M的人排除;
2,报数过程中索引不能因为有人排除而断掉,如何让索引在最后一名与开始一名接上;
3,最后一个人的编号与索引的关系。
那么开始写代码了!
# N为你设置的总人数,M为你选择的报数,方便验证此次选了8和3
N, M = 8, 3
# 围成圈后,有人的地方都为True
persons = [True] * N
# total为总人数,开始为N,以后每当遇到报数为M时,total应该就会排除一个人。
# num为报数值最大为M。
# index 为圈的索引起始为0,最大为 total-1
total, num, index = N, 0, 0
# 当总人数大于1之前都应该继续报数
while total > 1:
# 当有人的索引时
if persons[index]:
num += 1
#当报数到M时应该讲此编号的人排除圈外
if num == M:
persons[index] = False
total, num = total - 1, 0
# 虽然人被排除了,但是索引还得继续增加起来,当增加到N的时候,索引为0,相当于报数了一圈,所以用index %= N来连接。
index += 1
index %= N
# 当total等于1的时候,while循环结束,此时需要找到列表中还为True的索引,此索引由于是从0开始,故与编号值之间的关系为编号-1=索引
for index, person in enumerate(persons):
if person:
print(index + 1)
break
得到最终结果为:7
希望能帮助小伙伴解决此题。么么哒!