HITOJ 1864 求Fibonacci數列的位數

life4711發表於2014-07-25

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;
}


相關文章