1.问题描述
假设银行整存整取存款不同期限的月息利率为:
0.63% 期限为1年
0.66% 期限为2年
0.69% 期限为3年
0.75% 期限为5年
0.84% 期限为8年
现在已知某人手上有2000元, 要求通过计算选择出一种存钱方案,使得这笔钱存入银行20年后获得利息最多,假定银行对超出存款期限的那部分时间不付利息.
2.问题分析
为了获得到最多的利息,应该在存入银行的钱到期后马上就取出来,然后再立刻将原本的本金加上当前所或利息作为新的本金存入银行,这样反复操作直到年限满20年为止。
3.源码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
long max = 0, cur = 0;
float rate[] = {0.63, 0.66, 0.69, 0.75, 0.84};
int a[] = {1, 2, 3, 5, 8};
int b[] = {0, 0, 0, 0, 0};
int c[] = {0, 0, 0, 0, 0};
int d[] = {0, 0, 0, 0, 0};
short e[] = {1, 0, 0, 0, 0, 0};
int m = 5;
int n = 20;
int u = 0;
int i = 0, j = 0, k = 0;
for(i=0; i<m; i++)
{
c[i] = n / a[i];
if(n % a[i] == 0)
{
c[i]++;
}
}
while(1)
{
for(i=0; i<m; i++)
{
e[i+1] = 0;
if(d[i]+e[i] >= c[i])
{
d[i] += e[i];
d[i] -= c[i];
e[i+1]++;
}
else
{
d[i] += e[i];
break;
}
}
if(e[m] == 1)
{
break;
}
u = 0;
for(i=0; i<m; i++)
{
u += a[i]*d[i];
}
if(u == n)
{
cur = 200000;
for(i=0; i<m; i++)
{
for(j=0; j<d[i]; j++)
{
cur *= (1+a[i]*rate[i]*12/100);
}
}
if(cur > max)
{
for(i=0; i<m; i++)
{
b[i] = d[i];
}
max = cur;
}
}
}
printf("%d %d %d %d %d, money=%.2lf\n", b[0], b[1], b[2], b[3], b[4], max/100.0);
return 0;
}
4.编译源码
$ gcc -o test test.c -std=c89
5.运行及其结果
./test
0 0 0 4 0, money=8841.01
6.结果解释
存4次5年,利息最多,共计本息8841.01
网友评论