黄金連点数-第4回ブルーブリッジカップjava B組

2757 ワード


タイトル:黄金の点数
 
 
黄金分割数0.61803...理不尽な数であり,この定数は非常に重要であり,多くの工事問題で現れる.時々この数字を正確に求める必要がある.
 
いくつかの精密工学では定数の精度が重要である.ハッブル宇宙望遠鏡を聞いたことがあるかもしれませんが、初めて打ち上げられた後、人工加工の間違いを発見しました.そのような巨大なものに対して、実は鏡面加工の時に髪の毛の糸よりも何倍も細い間違いがあっただけで、「近視眼」になりました.
 
 
本題に戻って、私たちはどのように黄金の分割数のできるだけ正確な値を求めますか?いろいろな方法があります.
 
簡単なのは、ハイスコアを使うことです.
 
                  1
ゴールド数=-----------------------------
                        1
             1 + -----------------
                          1
                 1 + -------------
                            1
                     1 + ---------
                          1 + ...
 
                            
 
この連分数で計算される「層数」が多ければ多いほど、その値は黄金分割数に近い.
 
この特性を利用して、黄金分割数の十分な正確な値を求めて、小数点の後100位まで四捨五入することを要求してください.
 
小数点以下3桁の値:0.618
小数点以下4桁の値:0.6180
小数点以下5桁の値:0.61803
小数点以下7桁の値:0.6180340
(末尾の0に注意、無視できません)
 
あなたの任務は、小数点以下100ビットの精度まで正確な黄金分割値を書くことです.
 
注意:端数の四捨五入!端数が0でも残しておきます!
 
明らかに答えは小数点で、小数点の後に100桁の数字があるので、ブラウザで直接数字を提出してください.
注:解答プロセスやその他の補助説明クラスの内容はコミットしないでください.
 
 
解決策
1.黄金分割点は(根5-1)/2であり、根5の高精度を100ビットまで求め、さらに大数演算-1と/2を行う.
2.再帰+大数
3.フィボナッチ増加数
コード#コード#
1.大数+開方
apiはルート番号をつける方法がなく、手作業で解決します.ネットで検索する方法はニュートン近似法です.
方法の詳細:http://blog.csdn.net/zhangpengyu321/article/details/8946703
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;


public class gNumber{
public static void main(String[] args){
//                  x^2 -2 = 0
BigDecimal x1 = new BigDecimal(1);
BigDecimal x2 = new BigDecimal(0);
BigDecimal dif = new BigDecimal(0);

BigDecimal precision =x1.divide(new BigDecimal(10).pow(100));
System.out.println(precision);
while(true){
x2 = x1.subtract(x1.pow(2).subtract(new BigDecimal(5)).divide(x1.multiply(new BigDecimal(2)),100, BigDecimal.ROUND_HALF_EVEN));

if(x1.compareTo(x2)==1){
dif = x1.subtract(x2);
}else{
dif = x2.subtract(x1);
}

if(dif.compareTo(precision)==-1){
//System.out.println(x1+","+x2);
break;
}

x1 = x2;

}


System.out.println(x1.subtract(new BigDecimal(1)).divide(new BigDecimal(2)));
}
} 
結果:
0.6180339887 4989484820 4586834365 6381177203 09179805762862135448 6227052604 6281890244 9707207204 1893911375
2.大数+再帰
import java.math.BigDecimal;

public class Main{
 public static void main(String[] args){
  
  int i;
  BigDecimal a=new BigDecimal(100);
  for(i=0;i<500;i++)
   a=BigDecimal.ONE.add(BigDecimal.ONE.divide(a,102,BigDecimal.ROUND_DOWN));
  a = a.subtract(BigDecimal.ONE);
System.out.println(a);
}
}

aの初期化は実際には任意であり,サイクル回数が一定の規模に達すると,aの結果誤差への影響は小さくなる.数学の美しさはここにあるだろう.