ブルーブリッジカップ黄金連点数(java題解)


金分割数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桁の数字があるので、ブラウザで直接数字を提出してください. 
注:解答プロセスやその他の補助説明クラスの内容はコミットしないでください.
メソッドのループ:
import java.math.BigDecimal;  
  
public class Main {  
  
    public static void main(String[] args) {  
        BigDecimal bd = new BigDecimal(1);  
        for (int i = 0; i < 1000; i++) {  
            bd = bd.add(BigDecimal.ONE);  
            bd = BigDecimal.ONE.divide(bd, 100, BigDecimal.ROUND_HALF_DOWN);  
        }  
        System.out.println(bd.toString());  
    }  
}  

方法2フィボナッチ:
//                

//                     

import java.math.BigInteger;

public class Main {
    public static void main(String[] args) {
        BigInteger firstNum = BigInteger.ONE; //1
        BigInteger secNum = BigInteger.ONE;
        BigInteger res = BigInteger.ZERO;   //0
        BigInteger TEN = BigInteger.TEN;   //10
        
        //BigInteger       
        for (int i = 0; i < 50000; i++) {  
            if (i == 0 || i == 1) {
                res = BigInteger.ONE;
            }
            res = secNum.add(firstNum); //  BigInteger  
            firstNum = secNum;
            secNum = res;
        }
        
        //for           
        for (int i = 0; i < 101; i++) {
            //             ,      ,     
            //         
            BigInteger ans = firstNum.divide(secNum);
            //    ,   =  *10
            firstNum = (firstNum.mod(secNum)).multiply(TEN);
            if (i!=0) {  //      100    
                System.out.print(ans);    
            }
        }
        System.out.println();
        
    }
}

メソッド3再帰:
import java.math.*;

public class Main {
    public static void main(String[] args) throws Exception {
        f(340);
        res = res.setScale(100, BigDecimal.ROUND_HALF_UP);
        System.out.println(res);

    }
    public static BigDecimal res1 = new BigDecimal(1);
    public static BigDecimal res = new BigDecimal(0);
    public static BigDecimal f(int n) {
        if(n==1) {
            return res1;
        }
        BigDecimal a = new BigDecimal(1);
        return res = a.divide(a.add(f(n-1)),1000,BigDecimal.ROUND_HALF_UP);
    }
}