题目链接: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相关推荐

  1. 斐波那契数列大数的压位c语言,HDU 1568 Fibonacci(大数前4位)

    分析:x=1234567.求其前四位数: log10(x)=log10(1.234567)+6. 所以1.234567=10^(log10(x)-6). 1234 =(int) 10^(log10(x ...

  2. HDU 1568 Fibonacci【求斐波那契数的前4位/递推式】

    Fibonacci Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Proble ...

  3. HDU 1568 Fibonacci

    题目链接 Problem Description 2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列(f[0]=0,f[1]=1;f[i ...

  4. HDU 1568 Fibonacci ★(取科学计数法)

    题目大意:问fibonacci数列的第n项的前四个数.   很好的一道题~~~如果取后几位的话,取模就可以了,但取前几位显然没这么简单= =-- 但假如我们能把它表示成小数(科学计数法)的话,那么要取 ...

  5. hdu 1568 Fibonacci(fibonacci通项+对数性质)

    Fibonacci Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. HDU - 1568 Fibonacci (斐波那契,大数取前几位

    2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列 (f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>= ...

  7. hdu 1568 Fibonacci 对数。。

    先看对数的性质,loga(b^c)=c*loga(b),loga(b*c)=loga(b)+loga(c); 假设给出一个数10234432,那么log10(10234432)=log10(1.023 ...

  8. 【HDU -1568】 Fibonacci(斐波那契通项公式+取对数)

    Fibonacci Problem Description 2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列 (f[0]=0,f[1] ...

  9. 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>= ...

  10. HDU 1848 Fibonacci again and again(博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1848 题意:游戏规则如下: 1.  这是一个二人游戏; 2.  一共有3堆石子,数量分别是m, n, ...

最新文章

  1. ios4.2文件夹及多任务
  2. 想转行学软件测试要注意哪些问题
  3. HTML中如何写for循环全选,利用html:multibox 循环遍历checkbox 并且全选全解除
  4. PHP 安全问题入门:10 个常见安全问题 + 实例讲解
  5. mysql switch binlog_如何使用 Golang 处理 MySQL 的 binlog
  6. 0xbc指令 st75256_DDOS终极加速列车算法
  7. CodeForces - 1579G Minimal Coverage(dp)
  8. 转:VMware安装Mac OS X Mavericks系统图文教程
  9. Linux中用户的简介与管理
  10. Netty工作笔记0009---Channel基本介绍
  11. freemarker ftl模板_Web开发人员必会的模板引擎技术之Freemarker
  12. 便于理解假设检验的好例子
  13. 微信公众平台开发网页开发
  14. 11个能够帮助Java开发者提升编程能力的Java论坛汇总
  15. WINVNC(二)omni_thread
  16. Android插件化方式实现View动态更新
  17. 前端微信小程序电影类仿淘票票微信小程序
  18. c语言之getchar函数输入字符
  19. 盲盒系统搭建——玩转盲盒系统
  20. js给动态添加的元素添加属性

热门文章

  1. CSDN发布:AI技术人才成长路线图
  2. angular同源策略禁止读取_Redis5.0数据淘汰策略详解(最新版本,面试常问)
  3. English vocabulary-1
  4. Vue 定义组件模板的七种方式(一般用单文件组件更好)
  5. 欢迎来怼--第二十九次Scrum会议
  6. 复习JS事件及DOM
  7. Spark集群新增节点方法
  8. 开源网站管理工具—Altman
  9. jquery判断页面标签是否存在
  10. Pthreads线程的基本常识