1. 程式人生 > 其它 >#2013藍橋杯-4.黃金連分數

#2013藍橋杯-4.黃金連分數

技術標籤:藍橋杯練習c語言

唉!標準答案沒看懂,找到個可以看懂的答案分析一波
題目描述
黃金分割數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位數字,請通過瀏覽器直接提交該數字。
注意:不要提交解答過程,或其它輔助說明類的內容。

答案:0.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911375
樣例

//分析
//
//按照題目給出的一種簡單方法,可以用斐波納契數列和模擬手算除法實現。
//
//黃金分割數實際上是相鄰的兩個斐波那契數的商。
//
//對於模擬手算除法,用下面程式碼所示的for迴圈即可實現。
//
//但是這種方法的精確度可能不夠。


# include <stdio.h>
# define F 50
int main(void)
{
    unsigned long long int fib[1000];   //unsigned 為無符號

    int f = 0;
    int a[101];
    fib[0] = 0;
    fib[1] = 1;                     //1x10的18次方 
    for(int i = 2; fib[i] < 1e18; i++)
     {
        fib[i] = fib[i - 1] + fib[i - 2]; //斐波那契數列 
        f++;
    }
    printf("%d\n", f);   //判斷 斐波那契數列 有多少個數字 
    unsigned long long int x = fib[F - 2];
    unsigned long long int y = fib[F - 1];
    for(int i = 0; i < 101; i++)   //重點在這下面!!!!! 
        {
        a[i] = x / y; //黃金分割  存入一個數!!     
        x = (x % y) * 10;  //這一段是精華 ,處理x的值,使下一個x/y存入黃金分割的下一位的數字 ! !! 記筆記!!! 
        printf("%d", a[i]); //一個一個數字的打印出來。  
    }
}