题解: [蓝桥杯 2024 国 C] 存钱

源题目地址:https://www.lanqiao.cn/problems/20114/learning/

题目分析

这道题目要求我们模拟银行账户的存取款操作,并计算每天的利息。关键点在于:

  1. 利息计算规则:每天按前一日余额的0.005%计算
  2. 利息舍入规则:小于0.01元的部分忽略不计
  3. 余额精度:始终保持两位小数

解题思路

  1. 使用整数计算:为了避免浮点数精度问题,我们将所有金额转换为分(1元=100分)进行计算
  2. 利息计算:每天计算前一日余额的0.005%利息,并舍去不足1分的部分
  3. 存取款处理:将输入的金额转换为分进行处理
  4. 输出格式:将最终结果转换回元并保留两位小数

代码实现

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),只使用了常数级别的额外空间。

算法特点

  1. 精度处理:使用整数运算避免浮点数精度问题
  2. 高效计算:直接计算利息并舍去不足部分
  3. 输入优化:使用快速输入方法处理大规模数据
  4. 输出控制:保证输出格式始终为两位小数

该解法能够高效处理题目给定的最大数据规模(M ≤ 2×10^5),确保在合理时间内完成计算。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐