#!/bin/python3
# Chocolate Feast
import math
import os
import random
import re
import sys
# Complete the chocolateFeast function below.
def chocolateFeast(n, c, m):
bars = int(n // c) # 购买的巧克力数量
turnbars = int(bars // m) # 可兑换的巧克力数量
wrappers = int(bars % m) # 兑换后剩下的包装纸数量
eat = bars + turnbars
while turnbars > 0:
turnbars,wrappers = divmod((wrappers + turnbars),m)
eat += turnbars
return eat
if __name__ == '__main__':
t = int(input())
for t_itr in range(t):
ncm = input().split()
n = int(ncm[0]) # 初始钱数
c = int(ncm[1]) # 巧克力的单价
m = int(ncm[2]) # 用包装纸可以免费换巧克力的数量
result = chocolateFeast(n, c, m)
print(result)
divmod() 函数是把除数和余数运算结果结合起来,返回一个包含商和余数的元组如(a // b, a % b)。
需要注意的是while语句里turnbars和wrappers分开求值的话,wrappers的值会因turnbars已经变了而导致结果错误,具体如下:
while turnbars > 0:
turnbars = int((wrappers + turnbars) // m)
wrappers = int((wrappers + turnbars) % m) # turnbars的值已经变了(与turnbars等式里右边的turnbars的值不同)
eat += turnbars
return eat
为了解决这个问题,除了可以用divmod函数外,还可以写成:
def chocolateFeast(n, c, m):
bars = int(n // c) # 购买的巧克力数量
turnbars = int(bars // m) # 可兑换的巧克力数量
wrappers = int(bars % m) # 兑换后剩下的包装纸数量
eat = bars + turnbars
while turnbars > 0:
sumbars = turnbars + wrappers
turnbars = int(sumbars // m)
wrappers = int(sumbars % m)
eat += turnbars
return eat