小F的永久代币卡回本计划| 豆包MarsCode AI刷题

56 阅读2分钟

image.png

问题解析

小F需要判断购买永久代币卡后需要登录的最少天数,使得累计返还的勾玉金额等于或超过购买价格。

问题拆解

  1. 回本定义
  • 每天登录游戏返还 b 勾玉。
  • 总返还金额达到或超过代币卡价格 a 时,小F才回本。
  1. 数学模型
  • 假设需要 n 天登录,则有:n×b≥a
  • 最小整数解为:n=⌈a/b⌉
  • 使用整除运算,可以将公式改写为:n=(a+b−1)//b
  1. 特殊情况
  • 如果 b >= a,一天即可回本,直接返回 1
  • 如果 b = 0,则无法回本(但题目假设每天有返还,故不处理此异常情况)。

解题思路

  • 直接套用公式 ( n = (a + b - 1) // b ),计算天数。
  • 通过整除运算可以避免浮点数计算,且保证结果为最小整数解。

代码实现

以下是完整的 Java 实现:

public class Main {
    public static int solution(int a, int b) {
        // 确保 b > 0,因为题目隐含了每天有返还的条件
        if (b <= 0) {
            throw new IllegalArgumentException("b must be greater than 0");
        }
        // 计算最少需要的天数
        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
    }
}

代码详解

核心公式

return (a + b - 1) / b;
  • 将 ( a ) 加上 ( b-1 ),确保整除上取整。
  • 使用整数运算,避免浮点数处理带来的误差。

输入验证

if (b <= 0) {
    throw new IllegalArgumentException("b must be greater than 0");
}
  • 检查 b 是否有效,防止无返还的特殊情况导致错误。

测试用例分析

示例 1: a = 10, b = 1

  • 每天返还 1 勾玉,需要: [ n = (10 + 1 - 1) / 1 = 10 ] 输出10

示例 2: a = 10, b = 2

  • 每天返还 2 勾玉,需要: [ n = (10 + 2 - 1) / 2 = 5 ] 输出5

示例 3: a = 10, b = 3

  • 每天返还 3 勾玉,需要: [ n = (10 + 3 - 1) / 3 = 4 ] 输出4

边界测试

  1. 边界值a = 1, b = 1
  • 每天返还 1 勾玉,结果为 1
  1. 高返还值a = 100, b = 100
  • 每天返还 100 勾玉,结果为 1
  1. 小返还值a = 100, b = 1
  • 每天返还 1 勾玉,结果为 100

时间复杂度

  • 计算公式时间复杂度:( O(1) ),直接通过整数运算得出结果。

  • 空间复杂度:( O(1) ),无额外空间分配。

总结

  • 本题通过简单的数学建模和整除运算,快速计算出回本所需的最少天数。
  • 公式 ( n = (a + b - 1) // b ) 不仅高效,而且避免了浮点数运算误差。
  • 代码清晰简洁,能够处理大部分合理输入,易于扩展和维护。