【趣学Python算法100例】最佳存款方案
问题描述
假设银行一年整存零取的月息为0.63%。现在某人手中有一笔钱,他打算在今后5年中的每年年底取出1000元,到第5年时刚好取完,请算出他存钱时应存入多少。
问题分析
根据题意,可以从第5年向前推算。已知“在今后5年中的每年年底取出1000元,这样到第5年的时候刚好可以取完”,因此,第5年年底会取出1000元,则可以计算出第5年年初在银行中所存的钱数为:
- 第5年年初存款数=1000/(1+12×0.0063)
据此推算出第4年、第3年直至第1年年初的银行存款数如下:
- 第4年年初存款数=(第5年年初存款数+1000)/(1+12×0.0063)
- 第3年年初存款数=(第4年年初存款数+1000)/(1+12×0.0063)
- 第2年年初存款数=(第3年年初存款数+1000)/(1+12×0.0063)
- 第1年年初存款数=(第2年年初存款数+1000)/(1+12×0.0063)
将推导过程用表格表示出来,如表1.3所示。
年初存款 | 公式 |
---|---|
第5年年初存款数 | 1000/(1+12×0.0063) |
第4年年初存款数 | (第5年年初存款数+1000)/(1+12×0.0063) |
第3年年初存款数 | (第4年年初存款数+1000)/(1+12×0.0063) |
第2年年初存款数 | (第3年年初存款数+1000)/(1+12×0.0063) |
第1年年初存款数 | (第2年年初存款数+1000)/(1+12×0.0063) |
算法设计
根据上述分析,从第5年年初开始向前递推就可求出这个人应该在银行中存钱的钱数。因此可以使用for循环语句,循环4次,每次循环都在上一次的基础上加上1000,再除以(1+12×0.0063)。
完整的程序
根据上面的分析,编写程序如下:
if __name__=="__main__":
i = 0
money = 0.0
while i < 5:
money = (money + 1000)/(1 + 0.0063 * 12)
i += 1
print("应该存入钱数为:%0.2f" %money) # 结果保留两位小数
上述是一种传统的解法,这里介绍另外一种解法, 这道题是一个 等值年金 的数学问题,它的目标是计算出一笔钱在银行存入时的初始金额,假设每年从银行中取出固定金额,且存款会产生利息。
- 月息为
0.63%
,则年息可以计算为:1+0.63%*12
- 某人计划在未来 5 年中的每年年底取出 1000 元,最后一年刚好取完,要求计算初始存入的金额。
- 每年年底取出 1000 元,因此问题可以看作一个 年金现值 问题。
等值年金的现值公式为:
其中:
- PV 是初始存入的金额(我们要求解的)。
- A是每年取出的金额,即 1000 元。
- r是年利率。
- n是年数,即 5 年。
我们可以简化这个公式,用年金现值公式计算:
def calculate_present_value(A, r, n):
# A 是每年取出的金额,r 是年利率,n 是年数
PV = A * (1 - (1 + r) ** -n) / r
return PV
# 给定条件
A = 1000 # 每年取出的金额
r = 0.0756 # 年利率7.56%
n = 5 # 5年
# 计算初始存入金额
initial_amount = calculate_present_value(A, r, n)
print(f"存钱时应存入的金额为: {initial_amount:.2f} 元")
总结
如果某人在银行的年利率为 7.56%(按月计息月利率为 0.63%),他打算每年取出 1000 元,5 年后刚好取完,那么他最初需要存入约 4039.44元。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 攻城狮小林
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果