1.问题描述:
假设银行整存整取存款不同期限的月息利率为:

0.63%    期限为1年

0.66%    期限为2年

0.69%    期限为3年

0.75%   期限为5年

0.84%   期限为8年

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

2.问题分析:

为了获取到最多的利息,应该在存入银行的钱到期后马上就取出来,然后再立刻将原来的本金加上当前所获取到的利息作为新的本金存入银行,这样反复操作直到年限满 20年为止。又由于存款的期限不同,对应的利率是不相同的,因此在 20 年中,不同的存取期限的组合所获得的利息也是不相同的。假设在这20年中,1年期限的存了x次,2年期限的存了x2次3年期限的存了x3次,5年期限的存了x5次,8年期限的存了x次,则到期时存款人所得的本利合计为:2000*(1+0.063)*1*(1+0.066)x2*(1+0.069)*3*(1+0.075)*5*(1+0.084)x86由题意可知,显然8年期限的存款次数最多为两次,因此可得到下面对存款期限的限
定条件:

0≤x8<2

0≤x5≤(20-8*x8)/5

0≤x3(20-8*x8-5*x5)/3

0≤x2≤(20-8*x8-5*x5-3*x3)/2

x1-20-8*x8-5*x5-3*x3-2*x2且x>=0

3.流程图:

4.源代码:

#include<stdio.h>
#include<math.h>
int main()
{
    int x1,x2,x3,x5,x8,y1,y2,y3,y5,y8;
    double max=0.0,result;
for(x8=0;x8<=2;x8++)
    for(x5=0;x5<=(20-8*x8)/5;x5++)
    for(x3=0;x3<=(20-8*x8-5*x5)/3;x3++)
    for(x2=0;x2<=(20-8*x8-5*x5-3*x3)/2;x2++)
{
    x1=20-8*x8-5*x5-3*x3-2*x2;
    result=2000.0*pow((1+0.0063*12),x1)
    *pow((1+2*0.0063*12),x2)
    *pow((1+3*0.0063*12),x3)
    *pow((1+5*0.0063*12),x5)
    *pow((1+8*0.0063*12),x8);
    if(result>max)
    {
        max=result;
        y1=x1;
        y2=x2;
        y3=x3;
        y5=x5;
        y8=x8;
    }

}
printf("获得利息最多的存款方式为:\n");
printf("8年期限的存了%d次\n",y8);
printf("5年期限的存了%d次\n",y5);
printf("3年期限的存了%d次\n",y3);
printf("2年期限的存了%d次\n",y2);
printf("1年期限的存了%d次\n",y1);
printf("存款人最终的获得的本利合计:%0.2f\n",result);
}