问题描述

假设银行一年整存零取的月息为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元