Python算法100例-2.5 存钱

完整源代码项目地址,关注博主私信'源代码'后可获取

1.问题描述

假设银行整存整取存款不同期限的月利率为:

·0.63%,期限为1年;

·0.66%,期限为2年;

·0.69%,期限为3年;

·0.75%,期限为5年;

·0.84%,期限为8年。

现在已知某人手上有2000元,要求通过计算选择出一种存钱方案,使得这笔钱存入银行20年后获得的利息最多。假定银行对超出存款期限的那部分时间不付利息。

2.问题分析

为了获取到最多的利息,应该在存入银行的钱到期后马上就取出来,然后再立刻将原来的本金加上当前所获取到的利息作为新的本金存入银行中,这样反复操作直到满20年为止。

又由于存款的期限不同,对应的利率是不相同的,因此在20年中,不同的存取期限的组合所获得的利息也是不相同的。

假设在这20年中,1年期限的存了 x 1 x_1 x1次,2年期限的存了 x 2 x_2 x2次,3年期限的存了 x 3 x_3 x3次,5年期限的存了 x 5 x_5 x5次,8年期限的存了 x 8 x_8 x8次,则到期时存款人所得的本利合计为:

2000 ∗ ( 1 + 0.063 ) x 1 ∗ ( 1 + 0.066 ) x 2 ∗ ( 1 + 0.069 ) x 3 ∗ ( 1 + 0.075 ) x 5 ∗ ( 1 + 0.084 ) x 8 2000*(1+0.063)x_1*(1+0.066)x_2*(1+0.069)x_3*(1+0.075)x_5*(1+0.084)x_8 2000(1+0.063)x1(1+0.066)x2(1+0.069)x3(1+0.075)x5(1+0.084)x8

由题意可知,显然8年期限的存款次数最多为两次,因此可得到下面对存款期限的限定条件:

0 ≤ x 8 ≤ 2 0≤x_8≤2 0x82

0 ≤ x 5 ≤ ( 20 − 8 ∗ x 8 ) / 5 0≤x_5≤(20-8*x_8)/5 0x5(208x8)/5

0 ≤ x 3 ≤ ( 20 − 8 ∗ x 8 − 5 ∗ x 5 ) / 3 0≤x_3≤(20-8*x_8-5*x_5)/3 0x3(208x85x5)/3

0 ≤ x 2 ≤ ( 20 − 8 ∗ x 8 − 5 ∗ x 5 − 3 ∗ x 3 ) / 2 0≤x_2≤(20-8*x_8-5*x_5-3*x_3)/2 0x2(208x85x53x3)/2

x 1 = 20 − 8 ∗ x 8 − 5 ∗ x 5 − 3 ∗ x 3 − 2 ∗ x 2 且 x 1 ≥ 0 x_1=20-8*x_8-5*x_5-3*x_3-2*x_2且x_1≥0 x1=208x85x53x32x2x10

3.算法设计

根据式①及对存款期限的限定条件,可以使用for循环来穷举出所有可能的存款金额,从中找出最大的存款金额就是该问题的解。

因为限定条件已经确定了,因此for循环的循环次数也就确定了。

4.确定程序框架

程序流程图如图所示。

在这里插入图片描述

5.完整的程序

根据上面的分析,编写程序如下:

%%time
# 存钱问题

if __name__=="__main__":
    #在20年中,1年期限的存了x1次,2年期限的存了x2次,以此类推
    max = 0.0
    for x8 in range(0,3):
        t5 = (20-8*x8)//5                                                   #存款5年的最大次数
        for x5 in range(0, t5+1):
            t3 = (20-8*x8-5*x5)//3                                  #存款3年的最大次数
            for x3 in range(0, t3+1):
                t2 = (20-8*x8-5*x5-3*x3)//2
                for x2 in range(0, t2+1):
                    x1 = 20-8*x8-5*x5-3*x3-2*x2     # 存款期限限定条件
                    # 判断条件
                    result = 2000* ((1+0.0063*12)**x1) * ((1+2*0.0066*12)**x2)* ((1+3*0.0069*12)**x3) * ((1+5*0.0075*12)**x5) * ((1+8*0.0084*12)**x8)
                    # y1、y2、y3、y5、y8用于记录获利最多的存款方式
                    if result > max:
                        max = result
                        y1 = x1
                        y2 = x2
                        y3 = x3
                        y5 = x5
                        y8 = x8
    # 输出结果
    print("获得利息最多的存款方式为:");
    print("8年期限的存了%d次" %y8);
    print("5年期限的存了%d次" %y5);
    print("3年期限的存了%d次" %y3);
    print("2年期限的存了%d次" %y2);
    print("1年期限的存了%d次" %y1);
    print("存款人最终的获得的本利合计:%0.2f" %result);


获得利息最多的存款方式为:
8年期限的存了0次
5年期限的存了4次
3年期限的存了0次
2年期限的存了0次
1年期限的存了0次
存款人最终的获得的本利合计:8763.19
CPU times: user 341 µs, sys: 113 µs, total: 454 µs
Wall time: 420 µs

程序说明:

1)“**”表示幂运算,x**y返回x的y次幂,即计算 x y x^y xy的值。例如,5**2=25。

2)使用括号“()”改变程序的优先级。Python语言中,括号“()”拥有最高优先级,可以强制表达式按照需要的顺序求值,括号中的表达式会优先执行,也可以利用括号使得表达式更加易读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飘逸高铁侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值