黃金連分數C 解題

2021-10-22 16:09:45 字數 2140 閱讀 1605

言歸正傳,我們如何求得**分割數的盡可能精確的值呢?有許多方法。

比較簡單的一種是用連分數:

1**數 = ---------------------

11 + -----------------

11 + -------------

11 + ---------

1 + ...

這個連分數計算的「層數」越多,它的值越接近**分割數。

請你利用這一特性,求出**分割數的足夠精確值,要求四捨五入到小數點後100位。

小數點後3位的值為:0.618

小數點後4位的值為:0.6180

小數點後5位的值為:0.61803

小數點後7位的值為:0.6180340

(注意尾部的0,不能忽略)

你的任務是:寫出精確到小數點後100位精度的**分割值。

注意:尾數的四捨五入! 尾數是0也要保留!

顯然答案是乙個小數,其小數點後有100位數字,請通過瀏覽器直接提交該數字。

注意:不要提交解答過程,或其它輔助說明類的內容。

從題目給出的式子我們可以我們可以推斷出斐波那契數列相鄰兩個數相除得到**分割數。

由於需要精確到100位小數,我們需要用到大數加法。網上很多解題思路不太對,我們需要精確到243項的斐波那契才能得到穩定的100位小數。

題解如下

#include

#include

#include

#include

using namespace std;

string sum

(string a, string b)

int temp=0;

for(

int i =

0; i < len; i++

)reverse

(ans.

begin()

, ans.

end())

;//return ans.substr(ans.find_first_not_of('0'));

if(ans.

find_first_not_of

('0'

)== string:

:npos)

return

"0";

else

return ans.

substr

(ans.

find_first_not_of

('0'))

;}string i2s

(int t)

intcmp

(string a, string b)

return0;

}string sub

(string a, string b)

int temp;

for(

int i =

0; i < len; i++

)else

borrow =0;

ans[i]

= temp +

'0';

}reverse

(ans.

begin()

, ans.

end())

;if(ans.

find_first_not_of

('0'

)== string:

:npos)

return

"0";

else

return ans.

substr

(ans.

find_first_not_of

('0'))

;}string div

(string a, string b)

ans.

(i2s

(t));}

return ans;

}int

main()

for(

int i =

100; i <

300; i++

)}

這裡我們用減法代替除法求得小數字。

從執行結果我們可以看到需要到243項相除才行

黃金連分數

分割數0.61803.是個無理數,這個常數十分重要,在許多任務程問題中會出現。有時需要把這個數字求得很精確。對於某些精密工程,常數的精度很重要。也許你聽說過哈勃太空望遠鏡,它首次公升空後就發現了一處人工加工錯誤,對那樣乙個龐然大物,其實只是鏡面加工時有比頭髮絲還細許多倍的一處錯誤而已,卻使它成了 近...

黃金連分數

分割數0.61803.是個無理數,這個常數十分重要,在許多任務程問題中會出現。有時需要把這個數字求得很精確。對於某些精密工程,常數的精度很重要。也許你聽說過哈勃太空望遠鏡,它首次公升空後就發現了一處人工加工錯誤,對那樣乙個龐然大物,其實只是鏡面加工時有比頭髮絲還細許多倍的一處錯誤而已,卻使它成了 近...

黃金連分數

分割數0.61803.是個無理數,這個常數十分重要,在許多任務程問題中會出現。有時需要把這個數字求得很精確。對於某些精密工程,常數的精度很重要。也許你聽說過哈勃太空望遠鏡,它首次公升空後就發現了一處人工加工錯誤,對那樣乙個龐然大物,其實只是鏡面加工時有比頭髮絲還細許多倍的一處錯誤而已,卻使它成了 近...