题目描述
在桌子上有1摞卡片,每个卡片有一个正整数编号,从上到下卡片的编号为1到n,现在进行n次操作,每次操作先扔掉最顶端的卡片,然后将新的最顶端的卡片(如果有)放到这摞卡片的底部。 设第i次操作扔掉了编号为j的卡片(i从1开始),那么这次操作能加的分数为j%i分,求n次操作完成后的总分。
输入数据
一个正整数n,n<1000000
输出数据
每次扔掉卡片的编号,中间用空格分隔
样例输入
7
样例输出
18
样例说明 最后的总分可能会超出int的范围
程序分析
解题思路
front指向队首元素,rear指向队尾的下一个元素若剩下最后一个元素的时候,将卡片扔掉的时候,就不能向末尾继续放置卡片了,front==rear 的时候就越界了,所以需要一个判断:
if front
< rear
:
arrayList
.append
(arrayList
[front
])
front
+= 1
rear
+= 1
代码
n
= int(input())
arrayList
= [i
+1 for i
in range(n
)]
front
, rear
= 0, n
timesJ
= 1
total
= 0
while front
< rear
and timesJ
<= n
:
tempI
= arrayList
[front
]
total
+= (tempI
% timesJ
)
timesJ
+= 1
front
+= 1
if front
< rear
:
arrayList
.append
(arrayList
[front
])
front
+= 1
rear
+= 1
print(total
)