存钱问题
问题描述
假设银行整存整取存款不同期限的月息利率为:
0.63% 期限1年
0.66% 期限2年
0.69% 期限3年
0.75% 期限5年
0.84% 期限8年
现在已知某人手上有2000元,要求通过计算选择出一种存钱方案使得这笔钱存入银行20年后获得的利息最多,假定银行对超出存款期限的那部分时间不付利息
问题分析
为了获取最多的利息,应该在存入银行的钱到期后马上就取出来,然后再立刻将原来的本金加上当前所获取到的利息作为新的本金存入银行中,这样反复操作直到年限满20年为止 由于存款的期限不同,对应的利率是不相同的,因此在20年中,不同的存取期限的组合 所获得的利息也是不相同的 假设这20年中,1年期限的存了x1次, 2年期限的存了x2次,3年期限的存了x3次,5年期限的存了x5次,8年期限的存了x8次,则到期时存款人所得的本利合计为:
2000(1+0.063)^x1 (1+0.066)^x2(1+0.069)^x3(1+0.075)^x5(1+0.084)^x8 式1
显然8年期限的存款次数最多为2次,因此可得到下面对存款期限的限定条件:
0 <= x8 <= 2
0 <= x5 <= (20 - 8*x8) / 5
0 <= x3 <= (20 - 8x8-5x5)/3
0<= x2 <= (20 - 8x8 - 5x5 -3X3)/2
x1 = 20 - 8x8-5x5-3x3-2x2 and x1 >= 0
算法设计
根据式1以及对存款期限的限定条件,可以使用for循环来穷举出所有可能的存款金额从中找出最大的存款金额就是该问题的解
#include <stdio.h>
#include <math.h>
int main(void)
{
int x1, x2, x3, x4, x5, x8;
int y1, y2, y3, y5, y8;
double max = 0.0, result; /*!<result 变量存放最后结果*/
/* !<使用for循环穷举所有可能存款方案 */
for (x8 = 0; x8 <= 2;x8++) {
for (x5 = 0; x5 <= (20 - 8*x8) / 5; x5++) {
for (x3 = 0; x3 <= (20 - 8*x8 - 5*x5) / 2; 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.0066*12), x2)
*pow((1+3*0.0069*12), x3)
*pow((1+5*0.0075*12), x5)
*pow((1+8*0.0084*12), x8);
/* !< y1, y2, y3, y8用于记录获利最多的存放方式*/
if (result > max) {
max = result; /* !< max变量存放当前的最大值*/
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);
}
/* !< pow function introduce */
/* double pow(double x, double y) */
/* function 计算x^y的值 */
/* !< output */
获得利息最多的存款方式为:
8年期限的存了0 次
5年期限的存了4 次
3年期限的存了0 次
2年期限的存了0 次
1年期限的存了0 次
存款人最终的获得的本利合计: 8763.19
Process returned 0 (0x0) execution time : 0.005 s
Press any key to continue.