翻纸牌

题目

100 张牌,数字为 1-100,顺序排成一行,背面朝上。
第 1 个人从第 2 张翻,每隔 1 张翻
第 2 个人从第 3 张翻,每个 2 张翻
第 n 个人从第 n+1 张翻,每隔 n 张翻
直到有人没有牌翻为止。
求结束时,正面朝上的牌的数字的和。

解答

结束条件,第 100 人要翻第 101 张牌,没有牌可翻,结束。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cards = [False]*100  # 总共100张卡,全部背面朝上,False即为背面朝上。
for p in range(1, 100): #1-99人能翻盘,第100人从101张开始翻牌,故第99人结束。
#第1人从第2张翻起,每隔1张翻。p=1表示第二张,p+1=2表示步长为2,每隔1张。
for c in range(p, 100, p+1):
cards[c] = not cards[c]

print(cards)
down_cards = []
for i in range(len(cards)):
if not cards[i]:
down_cards.append(i+1) #牌从1开始,属组从0开始,需要加1

print(down_cards)

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

背面朝上的牌:1,4,9,16,25,36,49,64,81,100