算法_数学问题_Question2_存款问题(java实现)

这篇文章讲述的是算法初级部分的算法数学问题_Question2存款问题问题的java实现,参考的书籍为清华大学出版社出版,贾蓓等编著的《c语言趣味编程1000例》,如有错误或者不当之处,还望各位大神批评指正。

问题描述

假设银行存取存款不同期限的月利息为:
0.63% 期限为1年
0.66% 期限为2年
0.69% 期限为3年
0.75% 期限为5年
0.84% 期限为8年
现在已知某人手上有2000元,要求通过计算选择出一种存钱方案,使得这笔钱存入银行20年后获得的利息最多,假定银行对超出存款期限的那部分不付利息。

算法分析

为获取最大利息,应存进银行期满后立即取出然后立即将本金和利息一起存入银行,如此反复操作期满为止。假设这20年中,1年期存了1次,2年期存了2次,3年期存了3次,5年期存了5次,8年期存了8次,则到期时存款人所得本金加利息为:
2000*(1+0.0063)^1*(1+0.0066)^2*(1+0.0069)^3*(1+0.0075)^5*(1+0.0084)^8

由此可知使用穷举法计算出每一种情况的利润再取最大利润即可,确定
每个for循环的取值范围:
y8:0~2
y5:0~(20-y8*8)/5
y3:0~(20-y8*8-y5*5)/3
y2:0~(20-y8*8-y5*5-y3*3)/2
y1=20-y8*8-y5*8-y3*3-y2*2
用max记录每次循环的结果取最大即可

代码实现

package mathematics;

public class Q2_SaveMoney {
    /**
     * 问题描述:假设银行存取存款不同期限的月利息为:
     *          0.63%   期限为1年
     *          0.66%   期限为2年
     *          0.69%   期限为3年
     *          0.75%   期限为5年
     *          0.84%   期限为8年
     *          现在已知某人手上有2000元,要求通过计算选择出一种存钱方案,使得
     *          这笔钱存入银行20年后获得的利息最多,假定银行对超出存款期限的那
     *          部分不付利息。
     * 算法分析:为获取最大利息,应存进银行期满后立即取出然后立即将本金和利息一
     *          起存入银行,如此反复操作期满为止。
     *          假设这20年中,1年期存了1次,2年期存了2次,3年期存了3次,5年期
     *          存了5次,8年期存了8次,则到期时存款人所得本金加利息为:
     *          2000*(1+0.0063)^1*(1+0.0066)^2*(1+0.0069)^3*(1+0.0075)^5
     *          *(1+0.0084)^8
     * 
     *          由此可知使用穷举法计算出每一种情况的利润再取最大利润即可,确定
     *          每个for循环的取值范围:
     *                              y8:0~2
     *                              y5:0~(20-y8*8)/5
     *                              y3:0~(20-y8*8-y5*5)/3
     *                              y2:0~(20-y8*8-y5*5-y3*3)/2
     *                              y1=20-y8*8-y5*8-y3*3-y2*2
     *          用max记录每次循环的结果取最大即可
     * 
     */
    public static void main(String[] args) {
            int y1 , y2 , y3 , y5 , y8 ;                                //各个期限的变量
            int x1=0 , x2=0 , x3=0 , x5=0 , x8=0 ;                      //记录次数用于输出
            double maxresult =0;                                        //记录结果
            double initsal = 2000 ;                                     //存入银行的钱为1000
            for(y8=0 ; y8<=2 ;y8++)                                     //8年期
                for(y5=0 ; y5<=(20-y8*8)/5 ; y5++)                      //5年期
                    for(y3=0 ; y3<=(20-y8*8-y5*5)/3 ; y3++)             //3年期
                        for(y2=0 ; y2<=(20-y8*8-y5*5-y3*3)/2 ; y2++){   //2年期
                            y1=20-y8*8-y5*5-y3*3-y2*2 ;
                            double result = initsal * Math.pow((1+0.0063*12), y1)
                                                    * Math.pow((1+2*0.0066*12), y2)
                                                    * Math.pow((1+3*0.0069*12), y3)
                                                    * Math.pow((1+5*0.0075*12), y5)
                                                    * Math.pow((1+8*0.0084*12), y8) ;
                            if(result>maxresult){
                                x1 = y1 ;
                                x2 = y2 ;
                                x3 = y3 ;
                                x5 = y5 ;
                                x8 = y8 ;
                                maxresult = result ;
                            }
                    }
        System.out.println("1年期"+x1+"次,2年期"+x2+"次,3年期"+x3+"次,5年期"+x5+"次,8年期"+x8+"次,获得本息合计为:"+maxresult);
    }
}

样例输出

1年期0次,2年期0次,3年期0次,5年期4次,8年期0次,获得本息合计为:8841.012499999999
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值