青训营X豆包MarsCode 技术训练营第二课 | 豆包MarsCode AI刷题

55 阅读5分钟

AI刷题第10题-小F的永久代币卡回本计划

题目

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


测试样例

样例1:

输入:a = 10, b = 1
输出:10

样例2:

输入:a = 10, b = 2
输出:5

样例3:

输入:a = 10, b = 3
输出:4

Python代码实现

def solution(a: int, b: int) -> int: def calculate_days(a, b): if b <= 0: # 如果每天返还的勾玉数为0或负数,无法回本 return -1 # 计算回本所需的天数,向上取整 days = (a + b - 1) // b return days

测试样例

if name == "main": # 样例1 a1, b1 = 10, 1 print(f"输入:a = {a1}, b = {b1}") print(f"输出:{calculate_days(a1, b1)}")

# 样例2
a2, b2 = 10, 2
print(f"输入:a = {a2}, b = {b2}")
print(f"输出:{calculate_days(a2, b2)}")

# 样例3
a3, b3 = 10, 3
print(f"输入:a = {a3}, b = {b3}")
print(f"输出:{calculate_days(a3, b3)}")

# 交互式输入
a = int(input("请输入卡片价格 a:"))
b = int(input("请输入每天返还的勾玉数 b:"))
result = calculate_days(a, b)
if result == -1:
    print("无法回本。")
else:
    print(f"至少需要登录 {result} 天才能回本。")

代码解释

  1. 函数 calculate_days

    • 参数 a 表示卡片的价格。
    • 参数 b 表示每天登录游戏可以返还的勾玉数。
    • 如果 b 小于等于0,返回 -1,表示无法回本。
    • 计算回本所需的天数,使用公式 (a + b - 1) // b 进行向上取整。
  2. 主程序

    • 包含三个测试样例,分别调用 calculate_days 函数并打印结果。
    • 交互式输入部分,读取用户输入的卡片价格 a 和每天返还的勾玉数 b,调用 calculate_days 函数计算回本所需的天数,并输出结果。

测试样例

  1. 样例1

    • 输入:a = 10, b = 1
    • 输出:10
  2. 样例2

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

    • 输入:a = 10, b = 3
    • 输出:4

运行试例

plaintext
深色版本
输入:a = 10, b = 1
输出:10

输入:a = 10, b = 2
输出:5

输入:a = 10, b = 3
输出:4

请输入卡片价格 a10
请输入每天返还的勾玉数 b1
至少需要登录 10 天才能回本

代码详细解释

代码结构

函数 calculate_days

public static int calculate_days(int a, int b) { 
    // 确保 b > 0,因为题目隐含了每天有返还的条件 
    if (b <= 0) { throw new IllegalArgumentException("b must be greater than 0"); 
    } 
    // 计算最少需要的天数,使用公式 (a + b - 1) 
    // b 进行向上取整 
return (a + b - 1) / b; 
}
  • 参数

    • a:表示卡片的价格。
    • b:表示每天登录游戏可以返还的勾玉数。
  • 逻辑

    • 首先检查 b 是否大于 0。如果 b 小于等于 0,抛出一个 IllegalArgumentException 异常,表示无法回本。
    • 使用公式 (a + b - 1) // b 计算回本所需的天数。这个公式的作用是向上取整,确保即使 a 不能被 b 整除,也能计算出正确的天数。
主程序
public static void main(String[] args) {
    // 测试样例
    System.out.println(calculate_days(10, 1) == 10); // 输出: true
    System.out.println(calculate_days(10, 2) == 5);  // 输出: true
    System.out.println(calculate_days(10, 3) == 4);  // 输出: true

    // 交互式输入部分
    Scanner scanner = new Scanner(System.in);
    System.out.print("请输入卡片价格 a: ");
    int a = scanner.nextInt();
    System.out.print("请输入每天返还的勾玉数 b: ");
    int b = scanner.nextInt();

    // 调用 calculate_days 函数计算回本所需的天数
    int days = calculate_days(a, b);
    System.out.println("需要登录 " + days + " 天才能回本。");

    // 关闭扫描器
    scanner.close();

测试样例:

调用 calculate_days 函数并打印结果,验证函数的正确性。

例如,calculate_days(10, 1) 应该返回 10,calculate_days(10, 2) 应该返回 5,calculate_days(10, 3) 应该返回 4。

交互式输入部分:

使用 Scanner 类从标准输入读取用户输入的卡片价格 a 和每天返还的勾玉数 b。 调用 calculate_days 函数计算回本所需的天数,并输出结果。 最后关闭 Scanner 对象,释放资源。

详细解释

函数 calculate_days:

参数:

a:卡片的价格,类型为 int。 b:每天登录游戏可以返还的勾玉数,类型为 int。

逻辑:

首先检查 b 是否大于 0。如果 b 小于等于 0,抛出一个 IllegalArgumentException 异常,表示无法回本。 使用公式 (a + b - 1) // b 计算回本所需的天数。这个公式的作用是向上取整,确保即使 a 不能被 b 整除,也能计算出正确的天数。 例如,如果 a = 10 且 b = 3,计算 (10 + 3 - 1) // 3 = 12 // 3 = 4,表示需要 4 天才能回本。

主程序:

测试样例:

调用 calculate_days 函数并打印结果,验证函数的正确性。 例如,calculate_days(10, 1) 应该返回 10,calculate_days(10, 2) 应该返回 5,calculate_days(10, 3) 应该返回 4。

交互式输入部分:

使用 Scanner 类从标准输入读取用户输入的卡片价格 a 和每天返还的勾玉数 b。 调用 calculate_days 函数计算回本所需的天数,并输出结果。 最后关闭 Scanner 对象,释放资源。

总结

这段代码通过定义一个函数 calculate_days 来计算购买一张永久代币卡后,需要登录多少天才能让累计返还的勾玉金额等于或超过购买价格。主程序中包含测试样例和交互式输入部分,确保代码的正确性和实用性。