top1编程
← 返回题目
题解

投资压岁钱

1 条题解

  • 0
    @ 2026-8-5 21:17:14

    P4378 投资压岁钱(基础)

    解题思路

    童童把 a 元压岁钱存进银行,年利率是 r%,问存多少年后钱能超过 b 元。

    这里用到的是"复利":存满一年后,钱变成原来的 (1 + r/100) 倍;第二年在第一年的基础上再乘一次。这样钱越滚越多,就像滚雪球。

    算法:用一个变量 cur 记录现在手里的钱,初始是 a;用一个变量 years 记录年数,初始是 0。只要 cur 还没超过 b(cur <= b),就执行"cur = cur × (1 + r/100),years 加 1"。循环结束后,years 就是答案,cur 就是最终的钱。

    拿样例 r=4、a=123、b=153 算一下:第一年 123 × 1.04 = 127.92;第二年约 133.04;第三年约 138.36;第四年约 143.90;第五年约 149.65;第六年约 155.63,终于超过 153。所以答案是 6 年,最终 155.63 元,和样例一致。

    边界情况:如果 a 一开始就比 b 大(比如 a=2000、b=100),循环一次也不执行,会输出 0 年和 2000.00,代码也能正确处理。小数计算有精度问题,用 double 比 float 更准确。

    题目特别要求用 scanf 和 printf 输入输出,所以我们包含 头文件,用 printf("%.2f") 保留两位小数。

    参考代码

    // 程序用途:按年利率r%复利计算,多少年后压岁钱超过目标值b
    // 题目要求用scanf和printf,所以包含<cstdio>而不写iostream
    #include <cstdio>
    using namespace std;
    
    int main() {
        double r, a, b;
        scanf("%lf%lf%lf", &r, &a, &b);   // 读入年利率、本金、目标钱数
        int years = 0;                    // 统计年数
        double cur = a;                   // cur表示现在手里的钱
        while (cur <= b) {                // 还没超过目标,就再存一年
            cur = cur * (1 + r / 100);    // 一年后变成原来的(1+r%)倍
            years++;
        }
        printf("%d %.2f\n", years, cur);  // 输出年限和最终钱数(保留两位小数)
        return 0;
    }
    

    复杂度分析

    复利增长很快,需要的年数很少(通常几十步以内),可以看作近似 O(log b);空间上只用了几个变量,额外空间复杂度是 O(1)。

    • 1