hdu 1568 Fibonacci(Fibonacci通项公式)

网友投稿 283 2022-08-31

hdu 1568 Fibonacci(Fibonacci通项公式)

题目:​​http://acm.hdu.edu.cn/showproblem.php?pid=1568​​

Description

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说的是否正确。

Input

输入若干数字n(0 <= n <= 100000000),每个数字一行。读到文件尾。

Output

输出f[n]的前4个数字(若不足4个数字,就全部输出)。

Sample Input

0 1 2 3 4 5 35 36 37 38 39 40

Sample Output

0 1 1 2 3 5 9227 1493 2415 3908 6324 1023

分析:x=1234567.求其前四位数: log10(x)=log10(1.234567)+6. 所以1.234567=10^(log10(x)-6). 1234 =(int) 10^(log10(x)-6)*1000. [6=length-4,length=(int)log10(x)+1]同时我们知道:

对于小于10000的数字可以存储在数组中直接输出,大于等于10000的数字则用上式计算。我们能知道:i<21 f[i]<1e4.当n=21时[(1-sqrt(5))/2]^n --> 0.618^n 0.618自乘5次就会退一个10进制等级。所以n>=21可以忽略[(1-sqrt(5))/2]^n。log10(x)=log10[ 1/sqrt(5)*[(1+sqrt(5))/2]^n ]=log10(1/sqrt(5))+n*log10(1+sqrt(5))/2).

例如:

log10(12345678)=log10(1.2345678*10^7)=log10(1.2345678)+7 log10(1.2345678)就是log10(12345678)的小数部分. log10(1.2345678)=qs 10^qs=1.2345678, 要求该数的前4位,则将 1.2345678*1000即可。

#include #include #include using namespace std;const int maxn=50; //,mod=1e4;int f[maxn];int main(){ f[0]=0; f[1]=1; for(int i=2;i<21;i++){ f[i]=f[i-1]+f[i-2]; //i<21 f[i]<1e4. } int n; double q1=log10(1/sqrt(5)),q2=log10((1+sqrt(5))/2); while(cin>>n){ if(n<21){ printf("%d\n",f[n]); continue; } double t=q1+n*q2; double p=t-(int)t; double ans1=pow(10,p); cout<<(int)(ans1*1000)<

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:poj 2912 Rochambeau(带权并查集)
下一篇:王老吉凉茶借独特营销方式抢占用户心智,吉文化带来别样惊喜体验!
相关文章

 发表评论

暂时没有评论,来抢沙发吧~