您的位置:首页 > 其它

HITOJ 1864 求Fibonacci数列的位数

2014-07-25 16:35 134 查看
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
)+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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: