记录学习路程,抛砖引玉。如有更好的算法或者出现错误,欢迎指点。
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几位。
为方便大家理解,我详细说明一些函数的引用。如果觉得没必要,直接跳到最后代码页即可。
以下是我解题思路(假设有6个人):
former = []
count = 0
for i in range(1,7):
former.append(i)
while True:
if len(former) == 1:
break
else:
count += 1
later = former[0]
former.pop(0)
if count == 3:
count = 0
continue
else:
former.append(later)
print(former)
"""
[1]
"""
对于 range() 函数,有几个注意点:
(1)它表示的是左闭右开区间;
(2)它接收的参数必须是整数,可以是负数,但不能是浮点数等其它类型;
(3)它是不可变的序列类型,可以进行判断元素、查找元素、切片等操作,但不能修改元素;
(4)它是可迭代对象,却不是迭代器。
a=list(range(6))#默认从0开始
b=list(range(1,6))#左闭右开没有6
c=list(range(1,15,2))#左闭右开没有15,2为等差
print(a)
print(b)
print(c)
"""
[0, 1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 3, 5, 7, 9, 11, 13]
"""
为什么上面6个人案例的代码是range(1,7)呢~现在是不是茅塞顿开了呢^^
在处理这个案例上运用这个函数实现了在数组列表后添加上相应的元素
c=list(range(1,15,2))
print(c)
c.append(19)
print(c)
"""
[1, 3, 5, 7, 9, 11, 13]
[1, 3, 5, 7, 9, 11, 13, 19]
"""
是的没错,最后介绍的就是移除,也是灭掉这个案例的大招。小例题如下,自己细品。
a1=list(range(6))
b1=list(range(1,6))
c1=list(range(1,15,2))
print(a1)
a=a1.pop(5)
print(a)
print(a1)
print("***************")
print(b1)
b=b1.pop(0)
print(b)
print(b1)
print("***************")
print(c1)
c=c1.pop(3)
print(c)
print(c1)
执行结果如下:
[0, 1, 2, 3, 4, 5]
5
[0, 1, 2, 3, 4]
***************
[1, 2, 3, 4, 5]
1
[2, 3, 4, 5]
***************
[1, 3, 5, 7, 9, 11, 13]
7
[1, 3, 5, 9, 11, 13]
说了一大堆,其实也就是几行代码而已…
n = int(input("请输入有几个人围圈:"))
former = [] # 创个空列表
count = 0 #用来计数
for i in range(1,n+1): #把元素1~n顺序放入列表,再提一次,左闭右开所以是n+1
former.append(i)
while True:
if len(former) == 1: # 如果列表的长度为1,结束收工
break
else:
count += 1 # 记数加1
later = former[0] #取出列表当中的第一个元素,并赋值给later
former.pop(0) #移除列表当中的第一个元素
if count == 3: # 整除3的话续列没你份,赶紧滚蛋
count = 0
continue
else:
former.append(later) #把不整除3的续入列表former后面
print("最后剩下的是第",former,"位") # 最后打印出剩余的那个仔
运行结果如下(假设有100人围圈):
请输入有几个人围圈:100
最后剩下的是第 [91] 位