hdu 1568 Fibonacci 对数。。
生活随笔
收集整理的這篇文章主要介紹了
hdu 1568 Fibonacci 对数。。
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
先看對數的性質,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);
最后取其小數部分。
#include<iostream> #include<cmath> using?namespace?std; int?fac[21]={0,1,1}; const?double?f=(sqrt(5.0)+1.0)/2.0; int?main() { ????double?bit; ????int?n,i; ????for(i=3;i<=20;i++)fac[i]=fac[i-1]+fac[i-2];//求前20項 ????while(cin>>n) ????{ ????????if(n<=20) ????????{ ????????????cout<<fac[n]<<endl; ????????????continue; ????????} ????????bit=-0.5*log(5.0)/log(10.0)+((double)n)*log(f)/log(10.0);//忽略最后一項無窮小 ????????bit=bit-floor(bit); ????????bit=pow(10.0,bit); ????????while(bit<1000)bit=bit*10.0; ????????printf("%d\n",(int)bit); ????} ????return?0; }
假設給出一個數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);
最后取其小數部分。
轉載于:https://www.cnblogs.com/anderson0/archive/2011/05/08/2040342.html
總結
以上是生活随笔為你收集整理的hdu 1568 Fibonacci 对数。。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 术语一
- 下一篇: AgileEAS.NET之ORM访问器