HOJ 1864—求Fibonacci第n个数有多少位?

 此题一看头就大,不知从何下手。通项公式是很容易推出来的,不过是两项幂的差,这个会有精度损失的。

但是仔细观察一下会发现,其实前面一项是大于1的,幂越大数越大。而后面一项小于1,幂越大则越小,当

n足够大时,那么后面就几乎对整个数无影响,可以忽略。我们只需要关心前面几项符不符合即可。发现都符合。

那么直接忽略掉,如同斯特林数一样的巧妙。

f[n]=1/sqrt(5)*{[(1+sqrt(5))/2]^n-[(1-sqrt(5))/2]^n};

下面是简单的代码:

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const double C = sqrt(5);

/*
 * 此题就是求第n个飞扑纳妾数列有多少位
 */
int main() {
    int T;
    double n;
    while (scanf("%d", &T) != EOF) {
        while (T--) {
            scanf("%lf", &n);
            double result = n * log10(0.5 + 0.5 * C) - log10(C);
            printf("%d\n", int(result) + 1);
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值