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