高精確度——黃金分割數(前100位)


題目描述:

黃金分割數0.61823... 是個無理數,這個常數十分重要,在許多工程問題中會出現。有時需要把這個數字求得很精確。

 

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

我們如何求得黃金分割數的盡可能精確的值呢?有許多方法。

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

 

這個連分數計算的“層數”越多,它的值越接近黃金分割數。

請你利用這一特性,求出黃金分割數的足夠精確值,要求四舍五入到小數后100位。

小數后3位的值為:0.618

小數后4位的值為:0.6180

小數后5位的值為:0.61803

小數后7位的值為:0.6180340

(注意尾部的0

你的任務是寫出小數后100位精度的黃金分割值。

 

#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
long long  a[100],b[101];

long long f(int n){
    if(a[n]!=0) return a[n];
    if(n==1||n==2) return a[0]=a[1]=1;
    else{
        a[n-1]=f(n-1);
        a[n-2]=f(n-2);
        return a[n-1]+a[n-2];
    }
} 
int main(){
    
    double c=1;
    f(80);
    
    //使用50項的精度 問題是為什么是要選50位? 
//    如果選用fibonacci數列中較大的三個值計算,例如:
//    121393/196418=0.618033988738...
//    196418/317811=0.618033988754...
//    會發現只能精確到小數點后10位
//    所以需要很大的整數(50位左右)相除,才能達到小數點后100位的精度
    unsigned long long int x = a[50 - 2];  
    unsigned long long int y = a[50 - 1];  
    for(int i = 0; i < 101; i++) {  
           // cout << x << " "<< y <<" "; 
       //模擬手算 例如8除13 0 第一位存入數組並輸出 余數是8 8*10再進行下一次手算 
    //然后要8*10再進行除法 那就是 13/80 =6 第二位存入數組 余數繼續 2*10 
    //再進行20/13 等於1 余數又*10 ........  實在不理解 直接在紙上進行計算就明白了 
        a[i] = x / y;  
        x = (x % y) * 10;  
        
        printf("%d", a[i]);  //利用上面的方法逐個輸出位數 
    } 
    return 0;
} 
實現代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM