(hdu 1568) Fibonacci
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1568
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),每个数字一行。读到文件尾。Output 输出f[n]的前4个数字(若不足4个数字,就全部输出)。Sample Input 0 1 2 3 4 5 35 36 37 38 39 40Sample Output 0 1 1 2 3 5 9227 1493 2415 3908 6324 1023
题意:输出指定斐波那契数列的前四位,不够四位的全输出;
分析:一:暴力求解,由于题目给出的数据n《=100000000,打表会超内存,用大数相加会超时
二:求大数前几位的方法:
当一个数非常大时,如何求出其前几位呢?
如果是给定一个特定的数,当然可以逐步取出每一位即可。如
a得个位,a/10得百位,a/10/10得千位。
但是,当求x^y的前几位时怎么办呢?若x,y都非常大,则显然很难解决:也许可以用大数乘法,暴力求解,结果自然是既占内存,又耗时间。
还有,此题斐波拉契数列的前几位,显然求出每个斐波拉契数是不现实的。因此,可以采用取对数的方法来解决。
先看对数的性质,loga(b^c)=c*loga(b),loga(b*c)=loga(b)+loga(c);假设给出一个数10234432,那么log10(10234432)=log10(1.0234432*10^7)=log10(1.0234432)+7
log10(1.0234432)就是log10(10234432)的小数部分.
log10(1.0234432)=0.010063744
10^0.010063744=1.023443198,
要求该数的前4位,则将1.023443198*1000即可。
因此,pow(10.0,x的小数部分)即可方便求出x的前几位。
求一数的前4位的对数方法可以表述为:
double x,temp;while(scanf("%lf",&x)!=EOF){temp = log(x) / log(10.0);temp = temp - floor(temp);///floor(temp)函数求出小于temp的最大整数temp = pow(10.0,temp);while(temp<1000)temp*=10;printf("%.0lf\n",temp);///四舍五入求整数。printf("%d\n",(int)temp);//不需要四舍五入,强制取整。}
三:采用斐波拉契数列通项公式
由上节可知,可以采用对数法解决该斐波拉契问题。以下为斐波拉契数列的通项公式。
F(n)=(1/√5)*[((1+√5)/2)^n-((1-√5)/2)^n](n=1,2,3.....)
改变通项的形式
F(n)=(1/√5)*[((1+√5)/2)^n-((1-√5)/2)^n](n=1,2,3.....)
=(1/√5)*[((1+√5)/2)^n*(1-((1-√5)/(1+√5))^n)](n=1,23.....)
即F(n)的各项可以由以上通项公式求得,而不是采用迭代。
对变化后的通项取对数,则得下式:
log10(F(n))=-0.5*log10(5.0)+((double)n)*log(f)/log(10.0)+log10(1-((1-√5)/(1+√5))^n)
其中第三部分非常小,当n很大时趋近于0,可以忽略掉。
因此,采用下式即可:
temp=-0.5*log(5.0)/log(10.0)+((double)n)*log(s)/log(10.0);
int main() {arr[0] = 0;arr[1] = 1;for(int i=2;i<=20;i++)arr[i] = arr[i-1]+arr[i-2];LL n;while(scanf("%lld",&n)!=EOF){if(n<=20){printf("%d\n",arr[n]);continue;}double s = (sqrt(5.0)+1.0)/2.0;double temp = -0.5*log(5.0)/log(10.0)+((double)n)*log(s)/log(10.0);temp -= floor(temp);temp = pow(10.0,temp);while(temp<1000)temp *= 10;printf("%d\n",(int)temp);}return 0; }
转载于:https://www.cnblogs.com/jun939026567/p/7297565.html
(hdu 1568) Fibonacci相关推荐
- 斐波那契数列大数的压位c语言,HDU 1568 Fibonacci(大数前4位)
分析:x=1234567.求其前四位数: log10(x)=log10(1.234567)+6. 所以1.234567=10^(log10(x)-6). 1234 =(int) 10^(log10(x ...
- HDU 1568 Fibonacci【求斐波那契数的前4位/递推式】
Fibonacci Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Proble ...
- HDU 1568 Fibonacci
题目链接 Problem Description 2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列(f[0]=0,f[1]=1;f[i ...
- HDU 1568 Fibonacci ★(取科学计数法)
题目大意:问fibonacci数列的第n项的前四个数. 很好的一道题~~~如果取后几位的话,取模就可以了,但取前几位显然没这么简单= =-- 但假如我们能把它表示成小数(科学计数法)的话,那么要取 ...
- hdu 1568 Fibonacci(fibonacci通项+对数性质)
Fibonacci Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU - 1568 Fibonacci (斐波那契,大数取前几位
2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列 (f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>= ...
- hdu 1568 Fibonacci 对数。。
先看对数的性质,loga(b^c)=c*loga(b),loga(b*c)=loga(b)+loga(c); 假设给出一个数10234432,那么log10(10234432)=log10(1.023 ...
- 【HDU -1568】 Fibonacci(斐波那契通项公式+取对数)
Fibonacci Problem Description 2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列 (f[0]=0,f[1] ...
- hdu 1568 (log取对数 / Fib数通项公式)
2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列 (f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>= ...
- HDU 1848 Fibonacci again and again(博弈)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1848 题意:游戏规则如下: 1. 这是一个二人游戏; 2. 一共有3堆石子,数量分别是m, n, ...
最新文章
- ios4.2文件夹及多任务
- 想转行学软件测试要注意哪些问题
- HTML中如何写for循环全选,利用html:multibox 循环遍历checkbox 并且全选全解除
- PHP 安全问题入门:10 个常见安全问题 + 实例讲解
- mysql switch binlog_如何使用 Golang 处理 MySQL 的 binlog
- 0xbc指令 st75256_DDOS终极加速列车算法
- CodeForces - 1579G Minimal Coverage(dp)
- 转:VMware安装Mac OS X Mavericks系统图文教程
- Linux中用户的简介与管理
- Netty工作笔记0009---Channel基本介绍
- freemarker ftl模板_Web开发人员必会的模板引擎技术之Freemarker
- 便于理解假设检验的好例子
- 微信公众平台开发网页开发
- 11个能够帮助Java开发者提升编程能力的Java论坛汇总
- WINVNC(二)omni_thread
- Android插件化方式实现View动态更新
- 前端微信小程序电影类仿淘票票微信小程序
- c语言之getchar函数输入字符
- 盲盒系统搭建——玩转盲盒系统
- js给动态添加的元素添加属性