题解
投资压岁钱
1 条题解
-
0
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