黄金连分数

来源:互联网 发布:java socket传输图片 编辑:程序博客网 时间:2024/05/17 08:42
黄金分割数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位数字,请通过浏览器直接提交该数字。

注意:不要提交解答过程,或其它辅助说明类的内容。


解题代码来自百度百科http://baike.baidu.com/link?url=-zg6NaZH9Wj9SrZZOp7XxtEnmW9-IAWh00RpNbqjgkH-YnQpjongp5SF5H0RU_Ar0iJFB0BjOc6VZ8frXR26abyzJTdonfUfAxtBZcG_uV36FYOk_fjkYANfcoHJ4NSY0ltlpDrXVe3NMACJ9Etbhq

#include <iostream>using namespace std;int main (){int d,e=2,i=0,j,k=10,N,m;cin>>N,N++;//输入小数点后的位数int *a=new int[2*N],*b=new int[N],*c=new int[2*N];while(++i<2*N)a[i]=b[i/2]=c[i]=0;for(cout<<"0.6",a[b[1]=m=2]=4;--N>1;)for(b[m]=e,d=0,j=k;--j+1&&!d;){for(c[i=2*m]=j*j%k,e=j*j/k;--i>m-2;e=d/k)c[i]=(d=e+b[i-m+1]*j)%k;for(i=d=m-1;i<2*m&&a[i]<=c[i];i++)(a[i]<c[i])?d=0:1;if(d)for(e=j<<1,cout<<j,i=1+2*m++;--i>m-2;)if((a[i]-=c[i])<0)a[i]+=k,a[i-1]--;}delete []a,delete []b,delete []c,cin.ignore(),cin.ignore();return 0;}



0 0