第十五届蓝桥杯大赛软件赛国赛Java 研究生组C题
·
题解: [蓝桥杯 2024 国 C] 存钱
源题目地址:https://www.lanqiao.cn/problems/20114/learning/
题目分析
这道题目要求我们模拟银行账户的存取款操作,并计算每天的利息。关键点在于:
- 利息计算规则:每天按前一日余额的0.005%计算
- 利息舍入规则:小于0.01元的部分忽略不计
- 余额精度:始终保持两位小数
解题思路
- 使用整数计算:为了避免浮点数精度问题,我们将所有金额转换为分(1元=100分)进行计算
- 利息计算:每天计算前一日余额的0.005%利息,并舍去不足1分的部分
- 存取款处理:将输入的金额转换为分进行处理
- 输出格式:将最终结果转换回元并保留两位小数
代码实现
import java.io.*;
import java.math.BigDecimal;
import java.util.StringTokenizer;
public class Main {
static class FastReader {
BufferedReader br;
StringTokenizer st;
public FastReader() {
br = new BufferedReader(new InputStreamReader(System.in));
}
String next() {
while (st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
}
public static void main(String[] args) throws IOException {
FastReader reader = new FastReader();
PrintWriter out = new PrintWriter(System.out);
int m = reader.nextInt();
long currentBalanceCents = 0L; // 当前余额,以分为单位
final double INTEREST_RATE = 0.00005; // 日利率0.005%
for (int i = 0; i < m; i++) {
// 计算前一天的利息(舍去不足1分的部分)
long dailyInterestCents = (long) (currentBalanceCents * INTEREST_RATE);
// 处理存取款
String transactionStr = reader.next();
BigDecimal transactionDecimal = new BigDecimal(transactionStr);
long transactionCents = transactionDecimal.multiply(BigDecimal.valueOf(100)).longValue();
// 更新余额(先加利息,再加存取款)
currentBalanceCents += dailyInterestCents + transactionCents;
// 输出当天结束时的余额
out.printf("%.2f\n", currentBalanceCents / 100.0);
}
out.close();
}
}
复杂度分析
- 时间复杂度:O(M),其中M是天数。我们只需要遍历每天的存取记录一次。
- 空间复杂度:O(1),只使用了常数级别的额外空间。
算法特点
- 精度处理:使用整数运算避免浮点数精度问题
- 高效计算:直接计算利息并舍去不足部分
- 输入优化:使用快速输入方法处理大规模数据
- 输出控制:保证输出格式始终为两位小数
该解法能够高效处理题目给定的最大数据规模(M ≤ 2×10^5),确保在合理时间内完成计算。
更多推荐
所有评论(0)