当前位置: 首页 > 工具软件 > FEAST > 使用案例 >

HackerRank python练习——Chocolate Feast

徐友樵
2023-12-01

Chocolate Feast

题目链接

#!/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
 类似资料: