返回列表 发帖

批处理脚本实现C语言趣味编程百例014:最大利息存钱

加分:1个技术分或者10个PB

要求用BAT脚本实现:

最大假设银行整存整取存款不同期限的月息利率分别为:
0.63% 期限=1年
0.66% 期限=2年
0.69% 期限=3年
0.75% 期限=5年
0.84% 期限=8年
利息=本金*月息利率*12*存款年限。
现在某人手中有2000元钱,请通过计算选择一种存钱方案,使得钱存入银行20年后得到的利息最多(假定银行对超过存款期限的那一部分时间不付利息)。

*问题分析与算法设计
为了得到最多的利息,存入银行的钱应在到期时马上取出来,然后立刻将原来的本金和利息加起来再作为新的本金存入银行,这样不断地滚动直到满20年为止,由于存款的利率不同,所以不同的存款方法(年限)存20年得到的利息是不一样的。
分析题意,设2000元存20年,其中1年存i1次,2年存i2次,3年存i3次,5年存i5次,8年存i8次,则到期时存款人应得到的本利合计为:
2000*(1+rate1)i1*(1+rate2)i2*(1+rate3)i3*(1+rate5)i5*(1+rate8)i8
其中rateN为对应存款年限的利率。根据题意还可得到以下限制条件:
0<=i8<=2
0<=i5<=(20-8*i8)/5
0<=i3<=(20-8*i8-5*i5)/3
0<=i2<=(20-8*i8-5*i5-3*i3)/2
0<=i1=20-8*i8-5*i5-3*i3-2*i2
可以用穷举法穷举所有的i8、i5、i3、i2和i1的组合,代入求本利的公式计算出最大值,就是最佳存款方案。

*程序说明与注释
#include<stdio.h>
#include<math.h>
int main()
{
int i8,i5,i3,i2,i1,n8,n5,n3,n2,n1;
float max=0,term;
for(i8=0;i8<3;i8++) /*穷举所有可能的存款方式*/
for(i5=0;i5<=(20-8*i8)/5;i5++)
for(i3=0;i3<=(20-8*i8-5*i5)/3;i3++)
for(i2=0;i2<=(20-8*i8-5*i5-3*i3)/2;i2++)
{
i1=20-8*i8-5*i5-3*i3-2*i2;
term=2000.0*pow((double)(1+0.0063*12),(double)i1)
*pow((double)(1+2*0.0063*12),(double)i2)
*pow((double)(1+3*0.0069*12),(double)i3)
*pow((double)(1+5*0.0075*12),(double)i5)
*pow((double)(1+8*0.0084*12),(double)i8);
/*计算到期时的本利合计*/
if(term>max)
{
max=term;n1=i1;n2=i2;n3=i3;n5=i5;n8=i8;
}
}
printf("For maxinum profit,he should so save his money in a bank:\n");
printf(" made fixed deposit for 8 year: %d times\n",n8);
printf(" made fixed deposit for 5 year: %d times\n",n5);
printf(" made fixed deposit for 3 year: %d times\n",n3);
printf(" made fixed deposit for 2 year: %d times\n",n2);
printf(" made fixed deposit for 1 year: %d times\n",n1);
printf(" Toal: %.2f\n",max);
/*输出存款方式*/
}COPY
*运行结果
For maxinum profit,he should so save his money in a bank:
made fixed deposit for 8 year: 0times
made fixed deposit for 5 year: 4times
made fixed deposit for 3 year: 0times
made fixed deposit for 2 year: 0times
made fixed deposit for 1 year: 0times
Total:8841.01
可见最佳的存款方案为连续四次存5年期。
*思考题
某单位对职工出售住房,每套为2万元。买房付款的方法是:
一次交清,优惠20%
从第一年开始,每年年初分期付款:
5年交清,优惠50%;
10年交清,优惠10%;
20年交清,没有优惠。
现在有人手中正好有2万元,若假定在今后20年中物价和银行利率均保持不变,问他应当选择哪种付款方式可以使应付的钱最少?

结果不支持小数  貌似方案一致  重写

TOP

还是我来抛个砖
@echo off&setlocal enabledelayedexpansion
set /a $=2000,#A=1,#B=2,#C=3,#D=5,#E=8
set /a A=12*63+10000,B=#B*12*66+10000,C=#C*12*69+10000,D=#D*12*75+10000,E=#E*12*84+10000
for /l %%a in (0 1 20) do (
    if %%a lss 19 (
       for /l %%b in (0 2 20) do (
           set /a N=%%a+%%b
           if !N! lss 18 (
              for /l %%c in (0 3 20) do (
                  set /a N=%%a+%%b+%%c
                  if !N! lss 16 (
                     for /l %%d in (0 5 20) do (
                        set /a N=%%a+%%b+%%c+%%d
                        if !N! lss 13 (
                           for /l %%e in (0 8 20) do (
                               set /a N=%%a+%%b+%%c+%%d+%%e
                               if !N! equ 20 (
                                  set /a _A=%%a/#A,_B=%%b/#B,_C=%%c/#C,_D=%%d/#D,_E=%%e/#E
                                  set "i=!$!"
                                  FOR %%i in (A B C D E) do (
                                      for /l %%j in (1 1 !_%%i!) do (
                                          set /a "i*=%%i"
                                          set i=!i:~,-4!
                                      )
                                   )
                                   if !i! gtr !#! set #=!i!&set @=#A!_A! #B!_B! #C!_C! #D!_D! #E!_E!
                               )
                           )
                        ) else if !N! equ 20 (
                                  set /a _A=%%a/#A,_B=%%b/#B,_C=%%c/#C,_D=%%d/#D
                                  set "i=!$!"
                                  for %%i in (A B C D) do (
                                      for /l %%j in (1 1 !_%%i!) do (
                                          set /a "i*=%%i"
                                          set i=!i:~,-4!
                                      )
                                  )
                                  if !i! gtr !#! set #=!i!&set @=#A!_A! #B!_B! #C!_C! #D!_D!
                               )
                     )
                  ) else if !N! equ 20 (
                            set /a _A=%%a/#A,_B=%%b/#B,_C=%%c/#C
                            set "i=!$!"
                            for %%i in (A B C) do (
                                for /l %%j in (1 1 !_%%i!) do (
                                    set /a "i*=%%i"
                                    set i=!i:~,-4!
                                )
                            )
                            if !i! gtr !#! set #=!i!&set @=#A!_A! #B!_B! #C!_C!
                         )
              )
           ) else if !N! equ 20 (
                     set /a _A=%%a/#A,_B=%%b/#B
                     set "i=!$!"
                     for %%i in (A B) do (
                         for /l %%j in (1 1 !_%%i!) do (
                             set /a "i*=%%i"
                             set i=!i:~,-4!
                         )
                     )
                     if !i! gtr !#! set #=!i!&set @=#A!_A! #B!_B!
                  )
       )
    ) else if %%a equ 20 (
           set "i=!$!"
           for /l %%i in (1 1 20) do (
               set /a "i*=A"
               set i=!i:~,-4!
           )
           if !i! gtr !#! set #=!i!&set @=#A20
      )
)
for %%i in (!@!) do (
    set str=%%i
    if !str:~2! neq 0 for %%j in ("!str:~,2!") do  set var=!var! !%%~j!年期 !str:~2!
)
echo 最大值: %#%%var%
pauseCOPY
1

评分人数

    • HAT: 感谢分享技术 + 1

TOP

返回列表