HITOJ 1864 求Fibonacci数列的位数

http://acm.hit.edu.cn/hoj/problem/view?id=1864

一个Fibonacci数列是这样定义的: f(1) = 1, f(2) = 1, f(n > 2) = f(n - 1) + f(n - 2) 
现在你的任务是, 对于每个给定的数K,计算f(K)的位数。 

输入 
第一行一个数N, 表示下面有N个测试数据。
紧接着下面N行, 每行一个整数K ( 1 <= K <= 2^32 -1 ) 
输出
对于每个输入K, 输出f(K)的位数, 每个输出占一行。

示例输入

5
1
2
3
10
20
示例输出
1
1
1
2
4
题目大意:给定一个数n,求第n个Fibonacci数的位数

大体思路:

                其实如果不嫌麻烦的话你可以用高精度来做。除此之外还有另外一种方法,利用斐波那契数列数列的公式,然后利用log10(n)+1即为位数。值得一提的是对于n比较小的数我们不能用该公式,应该用暴力的方法直接求出f(n),

代码如下:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <math.h>
using namespace std;
long long a[45];
int main()
{
    int T;
    scanf("%d",&T);
    a[0]=0;
    a[1]=1;
    for(int i=2;i<40;i++)
        a[i]=a[i-1]+a[i-2];
    while(T--)
    {
        long long n,len;
        scanf("%lld",&n);
        if(n<40)
            len=(int)log10(a[n])+1;
        else
            len=(int)(log10(1.0/sqrt(5)) +(double)n*log10((1.0+sqrt(5))/2.0))+1;
        printf("%lld\n",len);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值