package java2013B;
import java.math.BigDecimal;
import java.math.BigInteger;
/**
* @Author bennyrhys
* @Date 2020-03-09 23:33
* 标題: 黃金連分數
* 黃金分割數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.化為求斐波那契相鄰兩項的比值,到多少項?越多越精确,n/n+1項,n再往上增加,這個比值的小數點後101位是穩定的,也就是不變的
*
* 2.double無法表示100位小數,BigInteger和BigDecimal
*/
public class _04黃金連分數 {
public static void main(String[] args) {
BigInteger a = BigInteger.ONE;
BigInteger b = BigInteger.ONE;
for (int i = 3; i < 300; i++) {
BigInteger t = b;
b = a.add(b);
a = t;
}
BigDecimal divide = new BigDecimal(a, 110).divide(new BigDecimal(b, 110), BigDecimal.ROUND_HALF_DOWN);
System.out.println(divide.toPlainString().substring(0, 103));
// 進位
System.out.println(divide.setScale(100,BigDecimal.ROUND_HALF_UP).toPlainString());
}
}
文末福利
對了對了,文末發波福利
- 通過公衆号提示的關鍵字可以領取競賽資料。但是,有時候會失效,小夥伴可以在背景留言提醒我修複。
- 最後一波分享一些很有意義的開源幹貨
藍橋杯必刷真題: https://github.com/bennyrhys/LanQiao 求職必備刷題官網: https://github.com/bennyrhys/interview SpringBoot兩小時快速入門,極客表白浪漫紅包程式 https://github.com/bennyrhys/LuckyMoney-SpringBootProject SpringBoot兩小時快速入門,基因晶片個人資訊程式 https://github.com/bennyrhys/Girl-SpringBootProject SpringBoot之web進階,人類基因晶片程式-提升篇 https://github.com/bennyrhys/GirlPlus-SpringBootProject
小夥伴的支援是我堅持的動力,動動小手,點點(關注、👍、在看)。