HDU 1568
2013-01-16 11:39
302 查看
Fibonacci
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2295 Accepted Submission(s): 1077[align=left]Problem Description[/align]
2007年到来了。经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列 (f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2))的值全部给背了下来。
接下来,CodeStar决定要考考他,于是每问他一个数字,他就要把答案说出来,不过有的数字太长了。所以规定超过4位的只要说出前4位就可以了,
可是CodeStar自己又记不住。于是他决定编写一个程序来测验zouyu说的是否正确。
[align=left]Input[/align]
输入若干数字n(0 <= n <= 100000000),每个数字一行。读到文件尾。
[align=left]Output[/align]
输出f
的前4个数字(若不足4个数字,就全部输出)。
因为是求解前四位,在数据小于10000时打表处理。多余10000时,用公式1/sqrt(5)*(((1+sqrt(5))/2.0)^n+((1-sqrt(5))/2.0)^n),因为(1-sqrt(5))/2.0小于1,当n极大时忽略,就变为1/sqrt(5)*(((1+sqrt(5))/2.0)^n,再设f(n)=dddd.xxx*pow(10.0,k-4)并取对数就可以了。
#include <iostream> #include <stdio.h> #include <string.h> #include <math.h> using namespace std; int fb[25]={0,1,1}; const double b=(1+sqrt(5.0))/2; int main() { for(int i=3;i<25;i++)//打表处理前n<21时小于10000的数据 { fb[i]=fb[i-1]+fb[i-2]; //printf("fb[%d]=%d\n",i,fb[i]); } int n; while(scanf("%d",&n)!=EOF) { if(n<21)//小于10000,直接输出 printf("%d\n",fb ); else//大于10000,用公式计算 { double s=(-0.5)*log10(5.0)+n*log10(b); s=s-(int)s+3; s=pow(10.0,s); printf("%d\n",(int)s); } } return 0; }
相关文章推荐
- hdu 1568
- HDU 1568 Fibonacci(数学 递推式)
- hdu 1568 (log取对数 / Fib数通项公式)
- hdu - 1568 fibonacci
- HDU 1568 Fibonacci
- HDU 1568 对数
- hdu 1568 Fibonacci(fibonacci通项+对数性质)
- HDU 1568 Fibonacci (取对数)
- HDU 1568 Fibonacci
- 【HDU】-1568-Fibonacci(公式+log取小数)
- HDU 1568 Fibonacci
- hdu 1568 Fibonacci(斐波那契数列)
- HDU 1568 Fibonacci
- HDU 1568 Fibonacci
- hdu 1568 Fibonacci 快速幂
- HDU 1568 DNA sequence(迭代深搜)
- hdu 1568求斐波那契数的前4位 && hdu3117矩阵快速幂
- hdu 1568
- hdu 1568 Fibonacci
- hdu1568 Fibonacci