【HDU -1568】 Fibonacci(斐波那契通项公式+取对数)
Fibonacci
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 40
?
?
Sample Output
0 1 1 2 3 5 9227 1493 2415 3908 6324 1023
?
?
題解:?n <= 100000000,數據范圍很大,寫大數斐波那契數列肯定會超時,這里用到了斐波那契通項公式和取對數處理。
?
先給出斐波那契通項公式:
?
關于公式的推導,給出傳送門:??百度百科—斐波那契數列
我們知道了通項公式,題中要求結果大于4位的直接輸出前4位,怎么才能求前四位呢???我們要用到log取對數。
先看對數的性質,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
這樣想取前四位只要用這個數乘以1000再取整就行了
對公式取對數:
通項公式取對數后,會有誤差,所以我們要對結果不超過10000的數打表。?另外最后一項小于0,對前四位不造成影響,可以直接忽略。
#include<cstdio> #include<cstring> #include<cmath> double cnt=(1+sqrt(5))/2; int a[21]={0,1}; int main() {int n,i;for(i=2;i<21;++i)a[i]=a[i-1]+a[i-2];while(scanf("%d",&n)!=EOF){if(n<21)printf("%d\n",a[n]);else{double ans=-0.5*log10(5.0)+n*log10(cnt);ans=ans-floor(ans);//取到小數部分 ans=pow(10,ans); ans=floor(ans*1000);printf("%.0f\n",ans);}}return 0; }轉自https://blog.csdn.net/zwj1452267376/article/details/50490990
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【HDU -1568】 Fibonacci(斐波那契通项公式+取对数)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【CodeForces - 1041D】
- 下一篇: 【CodeForces - 569A】M