黑马程序员技术交流社区

标题: 黄金分割 [打印本页]

作者: 张昶    时间: 2013-4-3 23:38
标题: 黄金分割
本帖最后由 张昶 于 2013-4-6 11:07 编辑

黄金分割数0.618与美学有重要的关系。舞台上报幕员所站的位置大约就是舞台宽度的0.618处,墙上的画像一般也挂在房间高度的0.618处,甚至股票的波动据说也能找到0.618的影子....

    黄金分割数是个无理数,也就是无法表示为两个整数的比值。0.618只是它的近似值,其真值可以通过对5开方减去1再除以2来获得,我们取它的一个较精确的近似值:0.618034

    有趣的是,一些简单的数列中也会包含这个无理数,这很令数学家震惊!

    1 3 4 7 11 18 29 47 .... 称为“鲁卡斯队列”。它后面的每一个项都是前边两项的和。

    如果观察前后两项的比值,即:1/3,3/4,4/7,7/11,11/18 ... 会发现它越来越接近于黄金分割数!

    你的任务就是计算出从哪一项开始,这个比值四舍五入后已经达到了与0.618034一致的精度。

    请写出该比值。格式是:分子/分母。比如:29/47
作者: 张昶    时间: 2013-4-3 23:39
求高手!谁能给个答案喂,亲!
作者: 邵震    时间: 2013-4-4 00:02
思路就是设置一个数组储存int变量

然后用冒泡排序的原理进行相邻的数相加 得出下一个数  在用冒泡的原理取他们的比例 知道和黄金分割比一致

作者: Lobster    时间: 2013-4-4 00:38
  1.         public static void main(String[] args) {
  2.                 double res=0.0;
  3.                 double g = 0.618034;//判断值
  4.                 for(int i=1;;i++){
  5.                         //计算每一个前后两项比值
  6.                         res = Locas(i)/Locas(i+1);
  7.                         //四舍五入精度达到判断值
  8.                         if(res-g<4E-7&&res-g>-5E-7){
  9.                                 System.out.println(Locas(i)+"/"+Locas(i+1)+" = "+res);
  10.                                 break;
  11.                         }
  12.                 }
  13.         }
  14.         //获取鲁卡斯队列数列的第n项
  15.         public static double Locas(int n){
  16.                 if(n==1){
  17.                         return 1;
  18.                 }
  19.                 if(n==2){
  20.                         return 3;
  21.                 }
  22.                 return Locas(n-1)+Locas(n-2);
  23.         }
复制代码

作者: 张昶    时间: 2013-4-4 11:24
邵震 发表于 2013-4-4 00:02
思路就是设置一个数组储存int变量

然后用冒泡排序的原理进行相邻的数相加 得出下一个数  在用冒泡的原理取 ...

思路,我知道,我只想要代码,看看我的不足在哪里?
作者: 张昶    时间: 2013-4-4 11:30
Lobster 发表于 2013-4-4 00:38

谢谢!但是结果不正确!
作者: 邵震    时间: 2013-4-4 11:40
张昶 发表于 2013-4-4 11:24
思路,我知道,我只想要代码,看看我的不足在哪里?

我昨晚打了一个 就是不知道那里错了 思路什么都对 就是给数组赋值的时候出错了  我看完今天的视频在弄
作者: 打工人    时间: 2013-4-4 16:31
若还有问题,继续追问; 没有的话,尽量及时将帖子分类改成【已解决】~
作者: Lobster    时间: 2013-4-5 11:50
张昶 发表于 2013-4-4 11:30
谢谢!但是结果不正确!

{:3_62:}不对么。。。。我测试过是这项之后开始趋近于那个数的啊。。。。
作者: 冯超    时间: 2013-4-5 13:17
搞定·····应该没有什么问题
  有两种方式四舍五入!
  1. import java.math.BigDecimal;
  2. import java.text.DecimalFormat;


  3. public class test13 {
  4.         public static void main(String[] args) {
  5.                
  6.                 //四舍五入方式一
  7.                 //DecimalFormat df=new DecimalFormat("0.0000");
  8.        // System.out.println(df.format(11f / 7));
  9.       
  10.         int i = 1;
  11.      
  12.         while(true) {
  13.                 if(count(i))
  14.                          break;
  15.                 else
  16.                         i++;
  17.         }
  18.         System.out.println(i);
  19.         System.out.println((float)fib(i) / fib(i + 1));
  20.         //count(3);
  21.         /* 四舍五入的方式2
  22.          * System.out.println(BigDecimal.ROUND_HALF_UP);
  23.          * System.out.println(new BigDecimal(2f / 3).setScale(2, BigDecimal.ROUND_HALF_UP));
  24.         */
  25.                
  26.         //System.out.println(fib(6));
  27.         }
  28.         public static boolean count(int i) {
  29.                 DecimalFormat df=new DecimalFormat("0.000000");
  30.         //System.out.println(df.format(7f / 4));
  31.                 String value = df.format((float)fib(i) / fib(i + 1)); //求的六位小数的值
  32.        
  33.                 double result = Float.valueOf(value);
  34.                 //System.out.println(result == 0.618034f);
  35.             if(result == 0.618034f)
  36.                     return true;
  37.             else
  38.                     return false;
  39.                
  40.         }
  41.         public static int fib(int i) {
  42.                 if(i == 1)
  43.                         return 1;
  44.                 if(i == 2)
  45.                         return 3;
  46.                 else
  47.                         return fib(i-2) + fib(i -1);
  48.         }
  49. }
复制代码

作者: 张昶    时间: 2013-4-5 13:29
冯海霞 发表于 2013-4-4 16:31
若还有问题,继续追问; 没有的话,尽量及时将帖子分类改成【已解决】~

版主,这个还有问题啊。。。。。。我知道,若已解决,我会弄的。。。。。。版主,若若地问一句:现在发帖不得加分了吗,还是这些问题的分量不够重啊?
作者: 张昶    时间: 2013-4-5 13:30
Lobster 发表于 2013-4-5 11:50
不对么。。。。我测试过是这项之后开始趋近于那个数的啊。。。。

我看了一下答案,后面还有更接近的。
作者: 张昶    时间: 2013-4-5 13:30
冯超 发表于 2013-4-5 13:17
搞定·····应该没有什么问题
  有两种方式四舍五入!

谢谢!我会试试的!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2