永久代币卡回本问题解题笔记 | 豆包MarsCode AI刷题

96 阅读2分钟

题目概要

小F购买了一张永久代币卡,卡片的价格为 a 勾玉,每天登录可以返还 b 勾玉。小F想知道,至少需要登录多少天,才能让卡片回本(返还的勾玉总额不低于购买价格)。


解题思路

  1. 问题分析

    • 每天返还 b 勾玉,那么登录 x 天后的返还总额为 x * b
    • 回本的条件是:x * b >= a
    • 要求最小的天数 x 满足这个条件。
  2. 数学公式推导

    • 解不等式:x * b >= a

      • x >= a / b(向上取整)。
    • 因为天数是整数,所以 x 的值可以通过公式计算为:

      • x = (a + b - 1) / b(等价于向上取整公式,避免浮点运算)。
  3. 边界处理

    • 如果 b <= 0(每天返还的勾玉小于等于 0),则卡片永远无法回本。
    • 在这种情况下,可以直接返回 -1 表示无法回本。
  4. 实现细节

    • 根据公式直接计算 x 的值。
    • 输出结果,或者特殊情况返回 -1

代码实现

java
复制代码
public class Main {
    public static int solution(int a, int b) {
        // 如果每天返还的勾玉为 0 或负数,永远无法回本
        if (b <= 0) {
            return -1; // 表示无法回本
        }
        // 使用向上取整公式计算所需天数
        return (a + b - 1) / b;
    }

    public static void main(String[] args) {
        // 测试用例
        System.out.println(solution(10, 1) == 10); // 输出 10
        System.out.println(solution(10, 2) == 5);  // 输出 5
        System.out.println(solution(10, 3) == 4);  // 输出 4
        System.out.println(solution(10, 0) == -1); // 无法回本,输出 -1
    }
}

调试与验证

测试用例 1

输入:

css
复制代码
a = 10, b = 1

计算:

makefile
复制代码
x = (10 + 1 - 1) / 1 = 10

输出:

复制代码
10

测试用例 2

输入:

css
复制代码
a = 10, b = 2

计算:

makefile
复制代码
x = (10 + 2 - 1) / 2 = 5

输出:

复制代码
5

测试用例 3

输入:

css
复制代码
a = 10, b = 3

计算:

makefile
复制代码
x = (10 + 3 - 1) / 3 = 4

输出:

复制代码
4

测试用例 4

输入:

css
复制代码
a = 10, b = 0

逻辑:

css
复制代码
b <= 0,无法回本。

输出:

diff
复制代码
-1

解题心得

  1. 使用数学公式优化计算

    • 通过 (a + b - 1) / b 实现整数的向上取整,避免使用浮点运算。
  2. 边界情况的处理

    • 特殊情况 b <= 0 时,确保程序能正确返回 -1,避免陷入死循环或错误结果。
  3. 代码的可扩展性

    • 代码简洁、逻辑清晰,可以轻松扩展用于其他类似问题。这道题主要考察了简单数学推导和边界条件处理。通过公式 (a + b - 1) / b 实现天数的向上取整计算,是解决该问题的核心思路。