n张扑克牌,随机分成若干堆,从左到右排成一行,反复执行如下操作:
在每一堆扑克牌里拿出一张,放到最右边的空位。最终将形成一个递增(非严格)
序列的循环,特别地,如果n=1+2+3+…+k,那么将出现1,2,3,…,k的序列。
# 扑克游戏:n张扑克牌,随机分成若干堆,从左到右排成一行
# 从每堆扑克牌中拿出一张,放到最右边,反复操作,必然出现循环
# 特别地,当扑克数量为1+2+3+...+n时,会出现1,2,3,...,n
import random
num = int(input("请输入扑克牌的数量:"))
arr = []
while True:
temp_int = random.randint(1, num)
arr.append(temp_int)
num -= temp_int
if num == 0:
break
print("初始状态:", arr)
step = 0
arr_set = [arr]
while True:
step += 1
takeout = 0
# 用临时数组arr1进行操作,如果直接用arr会同步改变arr_set的值
arr1 = []
for i in arr:
arr1.append(i-1)
takeout += 1
arr1.append(takeout)
# 去掉所有0元素
while True:
if 0 in arr1:
arr1.remove(0)
else:
break
#
print(f"第{step}步:", arr1)
if arr1 in arr_set:
print(f"第{arr_set.index(arr1)}步到第{step}步出现循环,成功终止!")
break
arr_set.append(arr1)
arr = arr1