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} 天才能回本。")
代码解释
-
函数
calculate_days:- 参数
a表示卡片的价格。 - 参数
b表示每天登录游戏可以返还的勾玉数。 - 如果
b小于等于0,返回-1,表示无法回本。 - 计算回本所需的天数,使用公式
(a + b - 1) // b进行向上取整。
- 参数
-
主程序:
- 包含三个测试样例,分别调用
calculate_days函数并打印结果。 - 交互式输入部分,读取用户输入的卡片价格
a和每天返还的勾玉数b,调用calculate_days函数计算回本所需的天数,并输出结果。
- 包含三个测试样例,分别调用
测试样例
-
样例1:
- 输入:
a = 10, b = 1 - 输出:
10
- 输入:
-
样例2:
- 输入:
a = 10, b = 2 - 输出:
5
- 输入:
-
样例3:
- 输入:
a = 10, b = 3 - 输出:
4
- 输入:
运行试例
plaintext
深色版本
输入:a = 10, b = 1
输出:10
输入:a = 10, b = 2
输出:5
输入:a = 10, b = 3
输出:4
请输入卡片价格 a:10
请输入每天返还的勾玉数 b:1
至少需要登录 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 来计算购买一张永久代币卡后,需要登录多少天才能让累计返还的勾玉金额等于或超过购买价格。主程序中包含测试样例和交互式输入部分,确保代码的正确性和实用性。