斐波那契数列通项公式

dr-von.top

/*
斐波那契数列通项公式
fib[n]=(1/√5) * [((1+√5)/2)^n-((1-√5)/2)^n](n=1,2,3.....)
或者写成[(1+√5)/2]^n /√5 - [(1-√5)/2]^n /√5 【√5表示根号5】

// 为什么有两种写法,因为我试过不同的编译器,和不同的OJ,有时候是第一个式子正确,有时候是第二个式子正确

fib[87]到fib[91]的数都大于1e18
*/
/*
eg:
输出斐波那契数前4位数(数据范围n<100000000...忘了反正很大)
*/
int fib[22];
int main()
{
    double num;
    int n,f,i;
    fib[0]=0;
    fib[1]=1;
    for(i=2;i<=20;i++)
        fib[i]=fib[i-1]+fib[i-2];
    while(~scanf("%d",&n))
    {
        if(n<=20)//前20个数小于10000可以直接输出。
        {
            cout<<fib[n]<<endl;
            continue;
        }
        num=n*(log10((1+sqrt(5.0))/2.0))-log10(sqrt(5.0));
        /*
        *这里对通项公式两边同时取对数.由于n较大时((1-√5)/2)^n很小可以忽略,所以这里对公式进行了简化。
        */
        num-=floor(num);
        /*
        *取小数部分。由于个位数可以看成10的整数次方(如10^5.987=10^5*10^0.987)所以把个位数忽略也不影响结果的钱4位数字。
        */
        num=pow(10,num);//得到一个小数(与对应的斐波那契数差(10^x)倍)
        while(num<1000)
            num*=10;
        f=num;//消除小数部分得到前4位数 
        printf("%d\n",f);
    }
    return 0;
} 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值