Fibonacci数列(四)
时间限制:1000 ms | 内存限制:65535 KB
链接: NYOJ461,HDU1568。
描述
数学神童小明终于把0到100000000的Fibonacci数列(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2))的值全部给背了下来。
接下来,CodeStar决定要考考他,于是每问他一个数字,他就要把答案说出来,不过有的数字太长了。所以规定超过4位的只要说出前4位(高4位)就可以了, 可是CodeStar自己又记不住。于是他决定编写一个程序来测验小明说的是否正确。 首先:看到这个题的数据范围,0(n)的时间复杂度是不行的。然后想下数组可不可以用来储存呢?n<=100000000,数太大了,就算表示 ,也会超时。
再想是不是有循环节,但是前四位的是跟后面几位有关系的(可以产生进位),不能只存前四位;
最后想想:Fibonacci数肯定有公式可以求得公式如下:
具体一点的可以读一下百度的一篇文章:
http://jingyan.baidu.com/article/f3e34a128e48acf5ea65355b.html 代码:/************** Author:jiabeimuwei Times:16ms Sources:NYOJ461 **************/ #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #include<cmath> #include<ctime> #include<queue> #include<stack> using namespace std; //#include<windows.h> //#include<conio.h> #define max(a,b) a>b?a:b #define min(a,b) a>b?b:a #define mem(a,b) memset(a,b,sizeof(a)) #define malloc(sb) (sb *)malloc(sizeof(sb)) #define EPS 1e-8 #define DINF 1e15 #define MAXN 100050 #define MOD 1000000007 int fib(int n) { if (n<=1) return n; return fib(n-1)+fib(n-2); } int main() { int n,m,i,j; double a=(1.0+sqrt(5.0))/2.0; while(scanf("%d",&n)!=EOF) { if(n<=20) printf("%d\n",fib(n)); else { double count=-0.5*log10(5.0)+n*log10(a); int c; count=count-floor(count); count=pow(10,count); c=(int)(count*1000); printf("%d\n",c); } } return 0; } 学长的比较好的代码:: #include<stdio.h> #include<math.h> int f[]= {0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765}; int main() { int n,i,num; double a=-0.5*log(5)/log(10),b=log( ( 1+sqrt(5.0) )/2 )/log(10);//c=( 1-sqrt(5.0) )/( 1+sqrt(5.0) ); double ans; while(scanf("%d",&n)!=EOF) { if(n>=21) { ans=a+n*b;//+log(1-pow(c,n)); ans=ans-(int)ans; num=pow(10,ans)*1000; } else num=f[n]; printf("%d\n",num); } return 0; }