青训营X豆包MarsCode 学习笔记:小F的永久代币回购卡的计划|豆包MarsCode AI刷题

101 阅读3分钟

一、题目解析

问题描述
小F最近迷上了玩一款游戏,她面前有一个永久代币卡的购买机会。该卡片的价格为 a 勾玉,每天登录游戏可以返还 b 勾玉。小F想知道她至少需要登录多少天,才能让购买的永久代币卡回本。

输入输出说明

  • 输入:两个整数 ab,分别表示永久代币卡的价格(勾玉)和每天返还的勾玉数。
  • 输出:返回最少需要登录多少天才能回本。

测试样例

  • 样例 1:输入 a = 10, b = 1,输出 10
  • 样例 2:输入 a = 10, b = 2,输出 5
  • 样例 3:输入 a = 10, b = 3,输出 4

二、解题思路

1. 问题本质
小F需要购买一个永久代币卡,卡片的价格为 a 勾玉,而每天她可以通过登录游戏返还 b 勾玉。那么,回本的天数 d 满足以下公式:

d=⌈ab⌉d = \lceil \frac{a}{b} \rceil

其中,a 为卡片价格,b 为每天返还的勾玉数。d 需要向上取整,因为如果返还的勾玉不足以整除 a,那么小F还需要额外登录一天才能回本。

2. 特殊情况

  • 如果每天返还的勾玉 b 为 0,说明无法回本,应该返回一个极大的值或者异常情况提示。

3. 解决方法

  • 利用数学中的 向上取整 操作,可以使用 Python 中的 math.ceil() 来处理这种情况。ceil(a / b) 就是计算 a / b 的向上取整值。

三、代码实现

import math

def solution(a: int, b: int) -> int:
    if b == 0:  # 如果每天返还的勾玉为0,无法回本,返回一个特殊值
        return float('inf')  # 或者返回 -1,表示无法回本
    return math.ceil(a / b)

# 测试用例
if __name__ == '__main__':
    print(solution(10, 1) == 10)  # 10 / 1 = 10
    print(solution(10, 2) == 5)   # 10 / 2 = 5
    print(solution(10, 3) == 4)   # 10 / 3 = 3.33 -> 4
    print(solution(10, 0) == float('inf'))  # b 为 0,无法回本

四、知识总结

  1. 数学运算技巧:

    • 向上取整 (math.ceil) 在解决这类问题时非常有用,尤其是当我们需要确保即使有余数也要算上额外的天数时。
  2. 边界条件的处理:

    • 特殊情况处理非常重要,例如 b = 0 的情况。这时我们需要确保返回合适的提示(如 inf-1),表示无法回本。
  3. 简单的除法和取整:

    • 这类问题主要考察的是对基础运算符(如除法和向上取整)的灵活应用。

五、学习建议

  1. 理解向上取整的应用:

    • 向上取整是很多实际问题中的关键步骤,特别是在涉及到天数、批次、或者其他不可能完全均分的情况时。多练习类似的应用场景。
  2. 代码优化与边界条件:

    • 在实际编码时,一定要考虑到所有可能的边界条件,尤其是分母为 0 或负数的情况。通过清晰的异常处理保证程序的鲁棒性。
  3. 数学思维:

    • 学会通过数学公式简化问题,有时不需要复杂的循环和判断,简单的数学公式和运算就能解决问题。

六、个人总结

本题通过简单的除法和向上取整的操作,快速解决了如何计算回本天数的问题。通过运用 Python 中的 math.ceil(),使得这类问题变得非常简洁。进一步提升了我对数学运算与编程技巧结合的理解,尤其是如何利用基本的数学操作来避免复杂的循环和判断。