標題: 黃金連分數 黃金分割數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