2013年第4回ブルーブリッジカップC/C++プログラム設計本科B組省試合黄金連点数(結果記入)

1639 ワード

2013年第4回ブルーブリッジカップC/C++プログラム設計本科B組省試合テーマまとめ:
http://blog.csdn.net/u014552756/article/details/50576336
金連分数金分割数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.61803 39887 49894 84820 45868 34365 63811 77203 09179 80576 28621 35448 62270 52604 62818 90244 97072 07204 18939 11375
#include <stdio.h>
#define F 50

int main()
{

    unsigned long long int fib[1000], x, y;
    int f = 0, i;
    int a[105];
    fib[0] = 0;
    fib[1] = 1;

    for(i = 2; fib[i] < 1e18; i++)
    {
        fib[i] = fib[i-1] + fib[i-2];
        f++;
    }

    x = fib[F-2];
    y = fib[F-1];

    for(i = 0; i < 101; i++)
    {
        a[i] = x / y;
        x = (x % y) * 10;
        printf("%d", a[i]);
    }
    printf("
"); return 0; }