hud Fibonacci

来源:互联网 发布:笔记本电脑测评软件 编辑:程序博客网 时间:2024/04/30 05:01

Problem Description
2007年到来了。经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列
(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2))的值全部给背了下来。
接下来,CodeStar决定要考考他,于是每问他一个数字,他就要把答案说出来,不过有的数字太长了。所以规定超过4位的只要说出前4位就可以了,可是CodeStar自己又记不住。于是他决定编写一个程序来测验zouyu说的是否正确。
 
Input
输入若干数字n(0 <= n <= 100000000),每个数字一行。读到文件尾。
 
Output

            输出f[n]的前4个数字(若不足4个数字,就全部输出)。
 
Sample Input
012345353637383940
 
Sample Output
011235922714932415390863241023
 


由于数据过大,运用递归的方法进行计算肯定超时,并且最终的数据也无法存储。所以这题运用公式即:f(n)=1/(5^1/2){(1+(5^1/2))^n-(1-(5^1/2))^n};由于只求前四位,因此考虑运用科学计数法表示,对公式进行化简,发现后一项始终小于一,对于结果影响甚微,可先舍去最后用精度补上。对于<=16的数,直接用公式求(f(n)小于4位),大于16的用科学技术法保留前四位,为了提高精度,采用long double(对公式计算结果有影响);丢掉后面一部分进行对数运算,会影响精度,所以最后要加上0.001;

#include<iostream>
#include<cstdio>
#include<sstream>
#include<cmath>
using namespace std;


int main(){
    int n;
    while(cin>>n){
         long double f=(sqrt(5.0)+1)/2;
         long double e=(1-sqrt(5.0))/2;
         long double m=n*1.0;
        if(n<=16){
            long long a=(pow(f,m)-pow(e,m))/sqrt(5.0);
            printf("%lld\n",a);
        }
        else{
            double b=n*log10(f)-log10(sqrt(5.0));
            double c=b-int(b)+3;
             double t=10.0;
              long long d=pow(t,c)+0.001;
             printf("%lld\n",d);
        }
    }
    return 0;
}


0 0
原创粉丝点击