先看对数的性质,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
那么要取几位就很明显了吧~
先取对数(对10取),然后得到结果的小数部分bit,pow(10.0,bit)以后如果答案还是<1000那么就一直乘10。
注意偶先处理了0~20项是为了方便处理~

这题要利用到数列的公式:an=(1/√5) * [((1+√5)/2)^n-((1-√5)/2)^n](n=1,2,3.....)
取完对数
log10(an)=-0.5*log10(5.0)+((double)n)*log(f)/log(10.0)+log10(1-((1-√5)/(1+√5))^n)其中f=(sqrt(5.0)+1.0)/2.0;
log10(1-((1-√5)/(1+√5))^n)->0
所以可以写成log10(an)=-0.5*log10(5.0)+((double)n)*log(f)/log(10.0);
最后取其小数部分。

  1. #include<iostream>
  2. #include<cmath>
  3. using namespace std;
  4. int fac[21]={0,1,1};
  5. const double f=(sqrt(5.0)+1.0)/2.0;
  6. int main()
  7. {
  8. double bit;
  9. int n,i;
  10. for(i=3;i<=20;i++)fac[i]=fac[i-1]+fac[i-2];//求前20项
  11. while(cin>>n)
  12. {
  13. if(n<=20)
  14. {
  15. cout<<fac[n]<<endl;
  16. continue;
  17. }
  18. bit=-0.5*log(5.0)/log(10.0)+((double)n)*log(f)/log(10.0);//忽略最后一项无穷小
  19. bit=bit-floor(bit);
  20. bit=pow(10.0,bit);
  21. while(bit<1000)bit=bit*10.0;
  22. printf("%d\n",(int)bit);
  23. }
  24. return 0;
  25. }

转载于:https://www.cnblogs.com/anderson0/archive/2011/05/08/2040342.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(fibonacci通项+对数性质)

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

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

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

  4. HDU 1568 Fibonacci

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

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

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

  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(斐波那契通项公式+取对数)

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

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

  9. hdu 3117 Fibonacci Numbers

    一句话题意:求斐波那契数列第n项,如果位数大于8,则只显示最前4位和最后4位. 题解:对于最后4位,套斐波那契数列的矩阵快速幂模板,MOD为10000即可. 而对于最后4位: 已知斐波那契数列通项公式 ...

最新文章

  1. CMT跟踪算法学习笔记
  2. 大学生试用期辞退之没有工钱
  3. Hex与float之间相互转换
  4. php 格式化 sub,PHP DateTime sub()用法及代码示例
  5. JavaScript学习总结(四)——逻辑OR运算符详解
  6. React开发(178):ant design table基础用法
  7. 异常检测算法分类及经典模型概览
  8. 蓝桥杯 字母组串(递归)
  9. linux qt目录查看,QT遍历目录获取文件信息
  10. An Empirical Analysis of Anonymity in Zcash
  11. RFC2544吞吐量测试详细步骤-Renix软件操作演示
  12. php 开发 oa 框架,基于ThinkPHP框架开发的全功能OA办公管理系统PHP源码
  13. ios下使用speex进行音频压缩
  14. 11个超实用的创意设计思维训练方法
  15. 谷歌浏览器崩溃,无法搜索
  16. TF-IDF算法类毕业论文文献有哪些?
  17. 解决@Autowired警告
  18. 超越Yann LeCun:世界模型的学习和推理
  19. 简述计算机在市场调研与预测中的应用,《市场调研与预测》自考试卷-20210323213815.doc-原创力文档...
  20. flink消费kafka从指定时间消费offset的日志

热门文章

  1. php 图片路径混淆,爬虫遇到了字符图片混淆。pytesseract识别图片字符
  2. springboot创建单个对象
  3. 创建springmvc配置
  4. zookeeper的名词复盘-集群角色
  5. MyBatis 源码解读-typeHandlerElement()
  6. MybatisPlus入门之介绍
  7. 入门案例中使用的组件介绍
  8. 单继承-问题的抛出-单纯封装可能会出现重复的代码
  9. 新版本springboot-springboot与springcloud理解误区
  10. 设计模式之_动态代理_05