博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 1568 Fibonacci
阅读量:4507 次
发布时间:2019-06-08

本文共 1094 字,大约阅读时间需要 3 分钟。

 

Problem 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),每个数字一行。读到文件尾。

 

我们可以利用取对数把一个数变成我们想要的形式,例如1234567可以转化为1.234567具体过程如下:

log10(1234567)=log10(1.234567*10^6)=6+log10(1.234567);(log10(1.234567)为其小数部分)

10^(log10(1.234567))=1.234567;要去前四位只需乘以1000即可;

小于10000的那部分直接打出来。

另外就是数列公式的应用了公式如下:

取对数后

最后一项很小,可以忽略。

故log10(F(n))=-0.5*log10(5.0)+n*log10((1+sqrt(5))/2);

然后取其小数部分ans,pow(10.0,ans)(即10^ans),再乘以1000即可。代码如下:

#include
#include
int main(){ int f[21]={0,1}; int n,i; double ans; for(i=2;i<21;i++) f[i]=f[i-1]+f[i-2]; while(scanf("%d",&n)!=EOF) { if(n<21) printf("%d\n",f[n]); else { ans=-0.5*log10(5)+n*1.0*log10((1+sqrt(5))/2); ans-=int(ans); ans=pow(10.0,ans); while(ans<1000) ans*=10; printf("%d\n",int(ans));//这里不能用%.lf打印,%.lf会四舍五入的 } } return 0;}

 

 

转载于:https://www.cnblogs.com/duan-to-success/p/3274493.html

你可能感兴趣的文章
如何使用Eclipse编译C,C++,JAVA程序
查看>>
手把手教如何搭建node+egg项目 引入Sequelize
查看>>
Xcode 4 with External Static Library for iPhone Development
查看>>
linux——常用命令清单
查看>>
JS 20180415作业
查看>>
项目追求更高的性能,更高的并发,更高的可用 (1)
查看>>
安卓 root权限笔记
查看>>
安卓 okhttp小结
查看>>
cocos2d-x 关于无法找到gl/gl.h头文件错误,以及r.java无法生成解决办法
查看>>
Mysql创建自动生成时间列方法
查看>>
12171131第一次作业
查看>>
[转] asp.net中repeater按钮传值与分页
查看>>
不变字典 NSDictionary
查看>>
编程中的runtime_error问题
查看>>
语音合成
查看>>
argparse
查看>>
Pandas使用to_csv保存中文数据用Excel打开是乱码
查看>>
php正则表达式手册
查看>>
hdu3065 病毒侵袭持续中
查看>>
超大整数计算模拟算法
查看>>