13年第四届蓝桥杯C/C++大学B组真题———黄金连分数

/*  第四题
    标题: 黄金连分数


    黄金分割数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位数字,请通过浏览器直接提交该数字。
    注意:不要提交解答过程,或其它辅助说明类的内容。
*/

分析:观察分析黄金数计算公式

       n  =  2时,黄金数=1/2;

       n  =  3时,黄金数=2/3;

       n  =  4时,黄金数=3/5;

       n  =  5时,黄金数=5/8;

       n  =  6时,黄金数=8/13;

可以发现分子分母为斐波那契数列,当n越大时越接近黄金数,所以用尽可能大的相邻两个斐波那契数相除得到黄金数的后100位。

答案:

0.618033988749894848203508519241181336761987561883120044504229175554437019895135854714733360620808469

代码:

#include

unsigned long long ans[60] = {0,1,1,2};

int main()
{
    for( int i = 3; i < 55; i++ )
        ans[i] = ans[i-1] + ans[i-2];
    unsigned long long x = ans[50], y = ans[51];
    int vic[105];
    for( int i = 0; i < 100; i++ )
    {
        vic[i] = x/y;
        x = (x%y)*10;
        printf( i == 0 ? "0." : "%d",vic[i]);
    }
    return 0;
}

 

你可能感兴趣的:(蓝桥杯历届真题)