高精确度——黄金分割数(前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;
} 
实现代码
posted @ 2017-06-29 10:40  kent鹏  阅读(4834)  评论(0编辑  收藏  举报