藍橋杯2013真題 黃金連分數

2021-10-12 01:14:38 字數 1994 閱讀 7820

**分割數0.61803… 是個無理數,這個常數十分重要,在許多任務程問題中會出現。有時需要把這個數字求得很精確。

對於某些精密工程,常數的精度很重要。也許你聽說過哈勃太空望遠鏡,它首次公升空後就發現了一處人工加工錯誤,對那樣乙個龐然大物,其實只是鏡面加工時有比頭髮絲還細許多倍的一處錯誤而已,卻使它成了「近視眼」!!

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

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

1

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

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

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

11 + ---------

1 + ...

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

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

小數點後3位的值為:0.618

小數點後4位的值為:0.6180

小數點後5位的值為:0.61803

小數點後7位的值為:0.6180340

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

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

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

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

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

分析按照題目給出的一種簡單方法,可以用斐波納契數列和模擬手算除法實現。

**分割數實際上是相鄰的兩個斐波那契數的商。

對於模擬手算除法,用下面**所示的for迴圈即可實現。

但是這種方法的精確度可能不夠。

#include

#include

#include

using namespace std;

int n =50;

string add

(string a, string b)

int tmp=0;

for(

int i =

0; i < len;

++i)

else

ans[i]

= tmp %10+

'0';

tmp = tmp /10;

//向高位進製

}reverse

(ans.

begin()

, ans.

end())

;return ans.

substr

(ans.

find_first_not_of

('0'))

;}//a一定大於b

string subtract

(string a, string b)

else

a[i + k]

= a[i + k]

-'1'

+'0'

; a[i]

=(a[i]

-'0'+10

)-(b[i]

-'0')+

'0';}}

reverse

(a.begin()

, a.

end())

;return a.

substr

(a.find_first_not_of

('0'))

;}intcmp

(string a, string b)

}string divide

(string a, string b)

ans.(1

, t +

'0');}

return ans;

}int

main()

string ans =

divide

(a, b)

; cout << ans << endl;

return0;

}

備戰藍橋杯 2013真題(1)

大數學家高所有個好習慣 無論如何都要記日記。他的日記有個與眾不同的地方,他從不注朗年月日,而是用乙個整數代替,比如 4210 高斯出生於 1777年4月30日,在高斯發現的乙個重要定理的日記上標註著 5343,因此可算出那天是 1791年12月15日。高斯獲得博士學位的那天日記上標著 8113 請你...

備戰藍橋杯 2013真題(2)

小明是個急性子,上小學的時候經常把老師寫在黑板上的題目抄錯了。有一次,老師出的題目是 36 459 他卻抄成了 396 45 但是戲劇性的是,他的答案居然是對的!因為 36 459 396 45 17820 類似這樣的巧合還有很多,比如 27 594 297 54 假設 a b c d e 代表 1...

藍橋杯 歷屆真題 帶分數 STL

歷屆試題 帶分數 時間限制 1.0s 記憶體限制 256.0mb 問題描述 100 可以表示為帶分數的形式 100 3 69258 714。還可以表示為 100 82 3546 197。注意特徵 帶分數中,數字1 9分別出現且只出現一次 不包含0 類似這樣的帶分數,100 有 11 種表示法。輸入格...