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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 李慧声 于 2013-4-14 11:06 编辑

想想也就是在强调算法,这是我的算法,用递归做的,是通过画图,一个一个写出出生的牛,然后获得第几天有多少牛,然后在总结规律得出的,比较笨。
分析过程:Axx带表对Ax的第几个孩子.
  1. /**
  2. * 一个农夫养了一头牛,三年后,这头牛每一年会生出1头牛,生出来的牛三年后,又可以每年生出一头牛……
  3. * 问农夫10年后有多少头牛?n年呢?(不考虑其他因素,只考虑此数学问题)
  4. * @author Lihsh-PC
  5. *
  6. */
  7. public class Test {

  8.         /**
  9.          * @param args
  10.          */
  11.         public static void main(String[] args) {
  12.                 //十年后实际上是第十一年
  13.                 //n年后也就是第n+1年
  14.                 System.out.println("你想知道n年后有多少头牛,那请先输入n吧:");
  15.                 Scanner scanner = new Scanner(System.in);
  16.                 int years = scanner.nextInt();
  17.                 System.out.println(years + "年后有"+ getSum(years + 1) +"头牛");
  18.         }
  19.         /**
  20.          * 由题目可以知道:对于每一头牛单独而言,增长规律是1、2、3、4、5,6从第三项开始是一个等差数列 (可以看出从第四天看是,该天的牛数为第三天,第二天,第一天的牛之和)
  21.          * 从第四天开始出生的牛又要重复上述的等差数列                  0、0、0、1、2、3、4(已在第一头牛中计算了father)(和上面是一样的道理)
  22.          * 第五天出生的牛。。                                                                                        0、0、0、1、2、3、4()(已在第一头牛中计算了father)(和上面是一样的道理)
  23.          * -----------------------------------------------------------
  24.          *                                                                 1、1、1、2、3、4、6、9....
  25.          * 其实也就是兔子(斐波纳契数列)出生的问题的变种,最后我们得出的结论就是第n(n>4)天的牛数量是第(n-2)天,第(n-3)天,第(n-4)天的牛数量之和
  26.          * 即f(n)=f(n-2)+f(n-3)+f(n-4)(n > 4)
  27.          * f(1)=1
  28.          * f(2)=1
  29.          * f(3)=1
  30.          * 或者f(n)=1 n<4
  31.          * f(4) = 2
  32.          * 由上面的分析可以看出,是一个递归的问题
  33.          * @param years 多少年后
  34.          */
  35.         public static int getSum(int years){
  36.                 if(years == 0)
  37.                         return 0;
  38.                 else if(years >= 1 && years <= 3)
  39.                         return 1;
  40.                 else if(years > 3)
  41.                         return getSum(years -2) + getSum(years -3) + getSum(years -4);
  42.                 else
  43.                         System.out.println("输入有误,请重新输入!");
  44.                 return years;
  45.         }
  46. }
复制代码

牛数量.jpg (49.42 KB, 下载次数: 18)

牛数量.jpg

结果.jpg (8.29 KB, 下载次数: 27)

结果.jpg

7 个回复

倒序浏览
学习学习了。
回复 使用道具 举报
你看,你自己图片里计算的结果与你计算出来的结果都不一样.
回复 使用道具 举报
斐波纳契数列
回复 使用道具 举报
  1. public class PruduceCattle {

  2.         /** 一个农夫养了一头牛,三年后,这头牛每一年会生出1头牛,生出来的牛三年后,又可以每年生出一头牛……
  3.          * 问农夫10年后有多少头牛?n年呢?(不考虑其他因素,只考虑此数学问题)
  4.          * 规律:即f(n)=f(n-2)+f(n-3)+f(n-4)(n > 4);这个用递归效率奇低.
  5.          * 我找的规律:f(n)=f(n-1)+f(n-3);(n>3)
  6.          * @param args
  7.          */
  8.         public static void main(String[] args) {
  9.                 // TODO Auto-generated method stub
  10.                 Long begin=System.currentTimeMillis();
  11.                 System.out.println(getCattleCount(1000));
  12.                 System.out.println(System.currentTimeMillis()-begin+"毫秒");
  13.                 /*50          1000
  14.                 83316385      4.239507006748923E165
  15.                 0毫秒                    31毫秒*/        
  16.                 /*Long begin=System.currentTimeMillis();
  17.                 System.out.println(getSum(50));//这是最快的,我开始试1000,结果有十几分钟没出结果.而上面的算法算1000,只需要32毫秒.
  18.                 System.out.println(System.currentTimeMillis()-begin+"毫秒");*/
  19.         }
  20.         public static int getSum(int years) {
  21.                 if (years == 0)
  22.                         return 0;
  23.                 else if (years >= 1 && years <= 3)
  24.                         return 1;
  25.                 else if (years > 3)
  26.                         return getSum(years - 2) + getSum(years - 3) + getSum(years - 4);
  27.                 else
  28.                         System.out.println("输入有误,请重新输入!");
  29.                 return years;
  30.         }
  31.         public static double getCattleCount(int n){
  32.                 double sum=0;
  33.                 double first=1;
  34.                 double second=1;
  35.                 double thread=1;
  36.                 for(int i=0;i<n-3;i++){
  37.                         sum=first+thread;
  38.                         first=second;
  39.                         second=thread;
  40.                         thread=sum;
  41.                 }
  42.                 if(n<=3)
  43.                         return 1;
  44.                 else return sum;
  45.         }
  46.        
  47. }
复制代码
回复 使用道具 举报
陈圳 发表于 2013-4-13 11:07
你看,你自己图片里计算的结果与你计算出来的结果都不一样.

没有啊 我在程序注释的地方有说明了 十年后其实是第11年 图片里写的是每一年牛数量 写到第十年 没有写第11年而已
回复 使用道具 举报
李松柏 发表于 2013-4-13 11:08
斐波纳契数列

必须嗯哪~~~
回复 使用道具 举报
陈圳 发表于 2013-4-13 12:41

学习了 不错不错
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马