A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 遗失的美好YXJ 中级黑马   /  2014-7-1 22:03  /  1967 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 遗失的美好YXJ 于 2014-7-5 21:45 编辑

需求:
        假设你自己存钱养老,每年存9600元到银行,利率5%.
        1.计算从30岁(年初)开始存钱,到65岁退休开始取钱养老,按交了35年,那么到你退休的时候,你在银行存款的余额一共有多少(本利和,复利)?
        2.假设一:从65岁开始取钱(钱被取出之前是存在银行里,也要算利息的),假设你活到80岁.每年从银行取等额的钱,平均每年能拿多少养老金?
        3.假设二:从65岁开始每年平均取6万,总共可以取到多少岁?



15 个回复

倒序浏览
目测要沉啊,自己先顶一下
回复 使用道具 举报
很显然,这个问题 和实际结合的很紧密...
回复 使用道具 举报
龙泉长空 发表于 2014-7-2 21:25
很显然,这个问题 和实际结合的很紧密...

必须的,我以前是做保险的,以前用excel能做出结果.换java的话虽然也做出来了,但是代码的效率不高.
回复 使用道具 举报
class Test
{
        public static double getFuli(double x0,double r,int year)
        {
                return x0*Math.pow(1+r,year);//模型为:xk=x0(1+r)^k;
        }
        public static double getBenli(double x0,double r,int year)
        {
                return x0+x0*r*year;//本金+每年获得的利息*年数
        }
        public static void main(String[] args)
        {
                double fuli=getFuli(9600,0.05,35);       
                System.out.println(fuli);
                double benli=getBenli(9600,0.05,35);
                System.out.println(benli);
        }
}
回复 使用道具 举报
sugar 发表于 2014-7-2 22:30
class Test
{
        public static double getFuli(double x0,double r,int year)

同学,要算复利,而且是每年都要存钱,一直存到64岁
要不再改改?
回复 使用道具 举报
遗失的美好YXJ 发表于 2014-7-3 07:07
同学,要算复利,而且是每年都要存钱,一直存到64岁
要不再改改?

要改成什么?
xk=xk-1*(1+r);
xk-1=xk-2*(1+r);
.......
x1=x0*(1+r);
最后可以整理成xk=x0*(1-r)^k
管它是存到几岁呢,反正它说存了35年,k就是35
回复 使用道具 举报
sugar 发表于 2014-7-2 22:30
class Test
{
        public static double getFuli(double x0,double r,int year)

不好意思,之前的代码错了,下面的是我修改后的
class Test
{
        public static double getFuli(double x30,double r,int from,int to)
        {
                //x31=x30*(1+r)+x30;x32=x31*(1+r)+x30;......xk+1=xk-1*(1+r)+x30;
                //其中x30表示每年存入的钱数;r表示利率;from表示从多少岁存的,to表示存到多少岁
                double xk=x30;
                for(int i=from;i<to;i++)
                        xk=xk*(1+r)+x30;
                return xk;
        }
        public static double getBenli(double x30,double r,int from,int to)
        {
                //第一年存的钱产生的利息是x30*r*35(第一年存入的钱共存了多少年);
                //第二年存的钱产生的利息是x30*r*34(第二年存入的钱共存了多少年);
                //....将这些年产生的利息累加后再加上这些年一共存入的本钱就是最后的总钱数
                double lixi=0;
                for(int i=to;i>from;i--)
                {
                        lixi=lixi+x30*r*(i-from);
                }
                return x30*(to-from)+lixi;
        }
        public static double getEveryMoney(double x64,double r,int from,int to)
        {
                //x65=x64(1+r)+b;x66=x65(1+r)+b;......最后模型的解是x80=(x64+b/r)(1+r)^(to-from)-b/r;
                //令x80=0;解出b=(r*x64*(1+r)^(t0-from))/(1-(1+r)^(t0-from));由于是取出钱,所以b为负数,取绝对值就是取出多少钱。
                return Math.abs((r*x64*Math.pow(1+r,to-from))/(1-Math.pow(1+r,to-from)));
        }
        public static int getYear(double x64,double r,double b)
        {
                //x65=x64(1+r)-b;x66=x65(1+r)-b;....其中b为每年取出的钱数;
                //当xn最后小于等于0时说明不能取钱了
                double xk=x64;
                int count=0;
                while(xk>0)
                {
                        xk=xk*(1+r)-b;//下一年剩的钱数
                        count++;
                }
                return count;
        }
       
        public static void main(String[] args)
        {
                double fuli=getFuli(9600,0.05,30,65);       
                System.out.println(fuli);
                double benli=getBenli(9600,0.05,30,65);
                System.out.println(benli);
                double b=getEveryMoney(fuli,0.05,65,80);
                System.out.println(b);
                int year=getYear(fuli,0.05,60000);
                System.out.println(year);
               
        }
}
回复 使用道具 举报
本帖最后由 胥亮 于 2014-7-3 11:15 编辑

public void fuliSum(int year,duoble money,float rate )
{
      double sum=money;
      for(int x=1;x<=year;x++)
          sum=sum+sum*rate;
     return sum;
}
回复 使用道具 举报
本帖最后由 心者觉也 于 2014-7-3 14:00 编辑
  1. import java.util.Scanner;


  2. public class Insurance {

  3.         /**
  4.          * @author 心觉
  5.          * 需求:
  6.      *假设你自己存钱养老,每年存9600元到银行,利率5%.
  7.      *  1.计算从30岁(年初)开始存钱,到65岁退休开始取钱养老,按交了35年,那么到你退休的时候,你在银行存款的余额一共有多少(本利和,复利)?
  8.      *  2.假设一:从65岁开始取钱(钱被取出之前是存在银行里,也要算利息的),假设你活到80岁.每年从银行取等额的钱,平均每年能拿多少养老金?
  9.      *  3.假设二:从65岁开始每年平均取6万,总共可以取到多少岁?
  10.          */
  11.         public static void main(String[] args) {
  12.                 Scanner sc = new Scanner(System.in);
  13.                 System.out.println("请输入你存钱的年限,必须是正整数:");
  14.                 int year = sc.nextInt();
  15.                 System.out.println("第"+year+"年后,总金额为:"+all(year));
  16.                 System.out.println("其中本利:"+origin(year)+";  复利为:"+extend(year));
  17.                 //假设活到80岁,能取80-65 = 15次
  18.                 System.out.println("每年取出:"+average(15));
  19.                 //每年取6万
  20.                 System.out.println("每年取出6w,可取到"+(years(60000)+65)+"岁。");
  21.                 sc.close();
  22.         }
  23.         //----------------------------------------------------------------------------------
  24.         //一定年限内本利
  25.         public static double origin(int year){
  26.                 double sum = 0;
  27.                
  28.                 for(int i=1; i<=year; i++){
  29.                         double cell =9600;
  30.                         for(int j=1;j<=year; j++){
  31.                                 cell = 9600*0.05*j;
  32.                         }
  33.                         sum = sum +cell;
  34.                 }
  35.                 return sum-9600*year;
  36.         }
  37.         //一定年限后总金额(本金+利润),本方法采用递归
  38.         //第n年的金额 = n-1年的金额 * 1.05
  39.         public static double all(int year){
  40.                 double amount = 0;
  41.                 if(year <= 1){
  42.                         amount = 9600*1.05;
  43.                 }else{
  44.                         amount = 1.05*(all(year-1)+9600);
  45.                 }
  46.                 return amount;
  47.         }
  48.         //一定年限内的复利,总金额-本金-本利
  49.         public static double extend(int year){
  50.                 return all(year)-9600*year-origin(year);
  51.         }
  52.         
  53.         
  54.         //---------------------------------------------------------------------------------
  55.         //把所有存款都取出来,取n年,保证每年取的金额相等
  56.         //推导出求平均值的公式:x = 1.05^(n-1)*sum/[1.05^(n-1)+1.05^(n-2)+....+1.05+1]
  57.         //用到了后面的幂函数和幂函数求和的方法
  58.         public static double average(int year){
  59.                 double sum = all(35);
  60.                 double aver = miFunc(1.05, year-1)*sum/miSeries(1.05, year-1);
  61.                 return aver;
  62.         }
  63.         
  64.         //计算一个数的n次方
  65.         public static double miFunc(double x, int n){
  66.                 if(n < 1){
  67.                         return 1;
  68.                 }else{
  69.                         return miFunc(x, n-1)*x;
  70.                 }
  71.         }
  72.         // 计算x^0+x^1+x^2+...+x^n
  73.         public static double miSeries(double x, int n){
  74.                 double sum = 0;
  75.                 while(n >= 0){
  76.                         sum = sum + miFunc(x, n);
  77.                         n--;
  78.                 }
  79.                 return sum;
  80.         }
  81.         
  82.         //-----------------------------------------------------------------------------
  83.         //每次取x元,多少年取完。
  84.         public static int years(double x){
  85.                 int num = 0;
  86.                 double last = all(35);        //一开始取款的时候的资金
  87.                 while(last >= 0){
  88.                         last = (last-x)*1.05;         //上一年的余款+利息-6w就是取完之后所剩金额
  89.                         num++;                                //取一次,计数器加一
  90.                 }
  91.                 return num;
  92.         }
  93. }
复制代码

运行结果如下:
请输入你存钱的年限,必须是正整数:
35
第35年后,总金额为:910428.6981065981
其中本利:252000.0;  复利为:322428.6981065981
每年取出:83535.98426732936
每年取出6w,可取到92岁。


回复 使用道具 举报 1 0
/*
需求:
        假设你自己存钱养老,每年存9600元到银行,利率5%.
        1.计算从30岁(年初)开始存钱,到65岁退休开始取钱养老,按交了35年,那么到你退休的时候,
                  你在银行存款的余额一共有多少(本利和,复利)?
        2.假设一:从65岁开始取钱(钱被取出之前是存在银行里,也要算利息的),假设你活到80岁.
                  每年从银行取等额的钱,平均每年能拿多少养老金?
        3.假设二:从65岁开始每年平均取6万,总共可以取到多少岁?

*/
class Test
{
        public static double getSumMoney(double x30,double r,int from,int to)
        {
                //x31=x30*(1+r)+x30;x32=x31*(1+r)+x30;......xk+1=xk-1*(1+r)+x30;
                //其中x30表示每年存入的钱数;r表示利率;from表示从多少岁存的,to表示存到多少岁
                double xk=x30;
                for(int i=from;i<to;i++)
                        xk=xk*(1+r)+x30;
                return xk;
        }
        public static double getFuli(double x30,double r,int from,int to)
        {
                return getSumMoney(x30,r,from,to)-(to-from)*x30;
        }
        public static double getBenli(double x30,double r,int from,int to)
        {
                //第一年存的钱产生的利息是x30*r*35(第一年存入的钱共存了多少年);
                //第二年存的钱产生的利息是x30*r*34(第二年存入的钱共存了多少年);
                //....将这些年产生的利息累加就是本利
                double lixi=0;
                for(int i=to;i>from;i--)
                {
                        lixi=lixi+x30*r*(i-from);
                }
                return lixi;
        }
        public static double getEveryMoney(double x64,double r,int from,int to)
        {
                //x65=x64(1+r)+b;x66=x65(1+r)+b;......最后模型的解是x80=(x64+b/r)(1+r)^(to-from)-b/r;
                //令x80=0;解出b=(r*x64*(1+r)^(t0-from))/(1-(1+r)^(t0-from));由于是取出钱,所以b为负数,取绝对值就是取出多少钱。
                return Math.abs((r*x64*Math.pow(1+r,to-from))/(1-Math.pow(1+r,to-from)));
        }
        public static int getYear(double x64,double r,double b)
        {
                //x65=x64(1+r)-b;x66=x65(1+r)-b;....其中b为每年取出的钱数;
                //当xn最后小于等于0时说明不能取钱了
                double xk=x64;
                int count=64;
                while(xk>0)
                {
                        xk=xk*(1+r)-b;//下一年剩的钱数
                        count++;
                }
                return count;
        }
       
        public static void main(String[] args)
        {
                double fuli=getFuli(9600,0.05,30,65);       
                System.out.println("复利:  "+fuli);
                double benli=getBenli(9600,0.05,30,65);
                System.out.println("本利: "+benli);
                double b=getEveryMoney(getSumMoney(9600,0.05,30,65),0.05,65,80);
                System.out.println("每年取出:"+b);
                int year=getYear(getSumMoney(9600,0.05,30,65),0.05,60000);
                System.out.println("共取到:"+year);
               
        }
}
回复 使用道具 举报

这代码写的好漂亮
回复 使用道具 举报
sugar 发表于 2014-7-3 18:50
/*
需求:
        假设你自己存钱养老,每年存9600元到银行,利率5%.

跟我写的一样复杂
回复 使用道具 举报
sugar 发表于 2014-7-3 18:50
/*
需求:
        假设你自己存钱养老,每年存9600元到银行,利率5%.

看了下,貌似应该都能得出结果来,但是真心觉得@心者觉也写的好.
看的很清晰
回复 使用道具 举报

哎呀呀,这么说我会骄傲滴,不过是我比较注意排版和命名吧,代码逻辑其实一般啦。
PS:就木有大佬送我点技术分么
回复 使用道具 举报
心者觉也 发表于 2014-7-3 23:32
哎呀呀,这么说我会骄傲滴,不过是我比较注意排版和命名吧,代码逻辑其实一般啦。
PS:就木有大佬送我点 ...

应该让老师给技术分的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马