2013年第四屆藍橋杯——黃金連分數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.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(); } }

 

ans:

6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911374


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM