题目:假设银行一年整存零取的月息为0.63%。现在某人手中有一笔钱,他打算在今后的五年中的一年底取出1000元,到第五年时刚好取完,请算出他存钱时应存入多少。
其实这条题不是小弟自己想问的~!只是班内一女生问到,小弟学力不深不敢乱说给人家听,而且自己都不会做!所以请各位高手帮帮忙~~~!
// 从编程的角度出发写的程序。 答案应该为 1787。49
#include <iostream> using namespace std;
class Konto { private: double zinsen; double geld; public: Konto(){ zinsen = 0; geld = 0;} void setZinsen(double theZinsen); void rechnen(bool monateEnde); void einsparen(double einsparSumme); void geldabheben(double abheben); double info(){ return geld;} void reset(){ geld = 0;} }; void Kont:setZinsen(double theZinsen) { zinsen = theZinsen; } void Kont:rechnen(bool monateEnde) { if(monateEnde) geld = geld*(1+zinsen); } void Kont:geldabheben(double abheben) { geld = geld - abheben; } void Kont:einsparen(double einsparSumme) { geld = geld + einsparSumme; }
int main() { Konto myKonto; myKonto.setZinsen(0.0063); double geldSumme; static double k = 0.; double einsparen; do { einsparen = 1787 + k; myKonto.einsparen(einsparen); for(int i = 0; i<5; i++) { for(int j = 1; j<=12; j++) { myKonto.rechnen(j); if(j==12) myKonto.geldabheben(1000); } if(myKonto.info()<0) break; } geldSumme = myKonto.info(); // cout<<geldSumme<<endl; if(geldSumme<-0.001) { myKonto.reset(); k = k+0.0001; } else if(geldSumme>0.001) { k = k-0.0001; myKonto.reset(); } else break; }while(true);
cout<<einsparen<<endl; return 0; }
// 从编程的角度出发写的程序。 答案应该为 1787。49
// 贴出来后有字符给吃掉了,再试一下,
#include <iostream> using namespace std;
class Konto { private: double zinsen; double geld; public: Konto(){ zinsen = 0; geld = 0;} void setZinsen(double theZinsen); void rechnen(bool monateEnde); void einsparen(double einsparSumme); void geldabheben(double abheben); double info(){ return geld;} void reset(){ geld = 0;} }; void Kont:setZinsen(double theZinsen) { zinsen = theZinsen; } void Kont:rechnen(bool monateEnde) { if(monateEnde) geld = geld*(1+zinsen); } void Kont:geldabheben(double abheben) { geld = geld - abheben; } void Kont:einsparen(double einsparSumme) { geld = geld + einsparSumme; }
int main() { Konto myKonto; myKonto.setZinsen(0.0063); double geldSumme; static double k = 0.; double einsparen; do { einsparen = 1787 + k; myKonto.einsparen(einsparen); for(int i = 0; i<5; i++) { for(int j = 1; j<=12; j++) { myKonto.rechnen(j); if(j==12) myKonto.geldabheben(1000); } if(myKonto.info()<0) break; } geldSumme = myKonto.info(); // cout<<geldSumme<<endl; if(geldSumme<-0.001) { myKonto.reset(); k = k+0.0001; } else if(geldSumme>0.001) { k = k-0.0001; myKonto.reset(); } else break; }while(true);
cout<<einsparen<<endl; return 0; }
楼主,给你个示例:
double fun(int a); main() {
int a=5;
printf("%lf",fun(a)); } double fun(int a) { double sum=0;
if(a==1){sum=1000.0/(1+12*0.0063); printf("第 %d 年 年头余额:%lf 年尾计息后:%lf\n",6-a,sum,sum*(1+12*0.0063));} else{ sum+=(fun(a-1)+1000.0)/(1+12*0.0063); printf("第 %d 年 年头余额:%lf 年尾计息后:%lf\n",6-a,sum,sum*(1+12*0.0063)); } return sum; }
// 答案为1794。08
// 我对结算理解的不对,我原先认为,既然是月息,那么每个月都要计利息,比如 原先 100 元,月息 1% 那一个月后到手 101 元,下个月 就以 101 元为基础拉, 也就是说 一个月后 到手 101*(1+1%),这样推算,如果本金为 G0, 月息为 z% , 那么 一年后,结算应为 G0*(1+z%) ^ 12 , 当然这和大家的计算公式不一样,所以得出的结果就不一样了。
下面的程序改为按照大家的计算公式,那么问题就简单多,不需要每个月结算了,年底结算一次就可以了, 大家看看,现在这个答案是不是正确了。
#include <iostream> using namespace std;
class Konto // 一个关于存折的类 { private: // 私有 double zinsen; // 月息 double geld; // 存款数目 public: // 共有 Konto(){ zinsen = 0; geld = 0;} // 结构化, 在创建一个对象时,调用此函数 void setZinsen(double theZinsen); // 设置 月息 void rechnen(bool jahrEnde); // 结算 void einsparen(double einsparSumme); // 存款 void geldabheben(double abheben); // 提款 double info(){ return geld;} // 提供帐面情况 void reset(){ geld = 0;} // 对帐面存款数清零 }; void Kont:setZinsen(double theZinsen) { zinsen = theZinsen; } void Kont:rechnen(bool jahrEnde) { if(jahrEnde) geld = geld*(1+zinsen*12); // 依据大家的计算公式,一年后所应得的钱 } void Kont:geldabheben(double abheben) { geld = geld - abheben; } void Kont:einsparen(double einsparSumme) { geld = geld + einsparSumme; }
int main() { Konto myKonto; // 创建对象 myKonto.setZinsen(0.0063); // 设置 月息为 0。63% double geldSumme; // 钱的总数 static double k = 0.; // 一个调制变量, 初始为 0 double einsparen; // 存入数 do { einsparen = 1787 + k; // 我们假定, 第一次存入数为 1787 元 myKonto.einsparen(einsparen); // 将钱存入银行, for(int i = 1; i<=5; i++) // 5 年 循环 { myKonto.rechnen(i); // 每年年底结算 myKonto.geldabheben(1000); // 然后提款1000 元 if(myKonto.info()<0) // 返回帐面信息, 如果已经小于零, 那说明,当初存的钱的数目不够
// 那就不必再循环下去了,所以退出循环,对存款数重新设置 break; } geldSumme = myKonto.info(); // 返回帐面信息, // cout<<geldSumme<<endl; if(geldSumme<-0.001) // 我们认为如果钱款数目界与 0。001 和 -0。001 之间,那么就可以认为等于0 { // 如果当前钱款数目小于 -0。001,说明当初存款数还不够 myKonto.reset(); // 首先清零 k = k+0.0001; // 这个 k 为一个调整书, k 以 0。0001 为单位递增 } else if(geldSumme>0.001) // 如果当前钱款数目大于 0。001,说明当初存款数太多 { k = k-0.0001; // k 以 0。0001 为单位递减 myKonto.reset(); // 账户清零 } else // 如果不是以上情况,说明当初存款数目正好 break; // 退出 do while loop }while(true);
cout<<einsparen<<endl; // 显示当初存款数目 return 0; }