日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

斐波那契数列(公式)

發(fā)布時間:2024/1/3 综合教程 28 生活家
生活随笔 收集整理的這篇文章主要介紹了 斐波那契数列(公式) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

http://acm.hdu.edu.cn/showproblem.php?pid=1568

Fibonacci

Time Limit: 1000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3947Accepted Submission(s): 1817

Problem Description
2007年到來了。經(jīng)過2006年一年的修煉,數(shù)學(xué)神童zouyu終于把0到100000000的Fibonacci數(shù)列
(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2))的值全部給背了下來。
接下來,CodeStar決定要考考他,于是每問他一個數(shù)字,他就要把答案說出來,不過有的數(shù)字太長了。所以規(guī)定超過4位的只要說出前4位就可以了,可是CodeStar自己又記不住。于是他決定編寫一個程序來測驗zouyu說的是否正確。

Input
輸入若干數(shù)字n(0 <= n <= 100000000),每個數(shù)字一行。讀到文件尾。

Output
輸出f[n]的前4個數(shù)字(若不足4個數(shù)字,就全部輸出)。

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

要取前四位,用對數(shù)的方法log(fn)的小數(shù)部分是log(原數(shù)的科學(xué)計數(shù)法中前半部分),故10的這個小數(shù)次方就是這個原數(shù)的科學(xué)計數(shù)法中前半部分

求大數(shù)前幾位的方法

當一個數(shù)非常大時,如何求出其前幾位呢?

如果是給定一個特定的數(shù),當然可以逐步取出每一位即可。如

a得個位,a/10得百位,a/10/10得千位。

但是,當求x^y的前幾位時怎么辦呢?若x,y都非常大,則顯然很難解決:也許可以用大數(shù)乘法,暴力求解,結(jié)果自然是既占內(nèi)存,又耗時間。

還有,此題斐波拉契數(shù)列的前幾位,顯然求出每個斐波拉契數(shù)是不現(xiàn)實的。因此,可以采用取對數(shù)的方法來解決。

先看對數(shù)的性質(zhì),loga(b^c)=c*loga(b),loga(b*c)=loga(b)+loga(c);假設(shè)給出一個數(shù)10234432,那么log10(10234432)=log10(1.0234432*10^7)=log10(1.0234432)+7
log10(1.0234432)就是log10(10234432)的小數(shù)部分.

log10(1.0234432)=0.010063744

10^0.010063744=1.023443198,

要求該數(shù)的前4位,則將1.023443198*1000即可。

因此,pow(10.0,x的小數(shù)部分)即可方便求出x的前幾位。

求一數(shù)的前4位的對數(shù)方法可以表述為:

double x,temp;

while(scanf("%lf",&x)!=EOF)

{

temp=log(x)/log(10.0);

temp=temp-floor(temp); //floor(temp)函數(shù)求出小于temp的最大整數(shù)

temp=pow(10.0,temp);

while(temp<1000)

temp*=10;

//printf("%.0lf
",temp); //采用浮點表達法時會四舍五入

printf("%d
",(int)temp);//此處不需四舍五入,直接舍棄后面的位

}

}

下面給出斐波那契數(shù)列通項公式:

但是這個題要是直接套公式還是會超時,所以我們將通項公式左右取對數(shù),化簡得

log10(F(n))=-0.5*log10(5.0)+((double)n)*log(s)/log(10.0)+log10(1-((1-√5)/(1+√5))^n)

s =(1+sqrt(5.0))/2.0;

<提取的公因式s,然后將后面化成兩式相乘的形式>

注意:其中第三部分非常小,當n很大時趨近于0,可以忽略掉。

下面給出代碼

 1 #include<cstdio>
 2 #include<cmath>
 3 using namespace std;
 4 /*
 5 double f (int n )
 6 {
 7     return (1.0/sqrt(5.0))*(pow(((1.0+sqrt(5.0))/2),n)-pow( ((1.0-sqrt(5.0))/2),n ) );
 8 } 這樣處理以后還是會車超*/
 9 int ff(int n )
10 {
11     if(n==0) return 0;
12     if(n==1) return 1;
13     return ff(n-1)+ff(n-2);
14 }
15 int main()
16 {
17     int n;
18     while(~scanf("%d",&n))
19     {
20         //printf("%d ",(int)f(n));
21         if(n>=21)
22         {
23             //double temp = log(f(1.0*n))/log(10.0);//計算的時候還是會超
24             double s = (1+sqrt(5.0))/2.0;
25             double temp = -0.5*log(5.0)/log(10.0)+((double)n)*log(s)/log(10.0);
26             temp = temp - floor(temp);
27             temp = pow(10.0,temp);
28             while(temp<1000.0)
29             {
30                 temp*=10.0;
31             }
32             printf("%d
",(int)temp);
33         }
34         else
35             printf("%d
",ff(n));
36     }
37     return 0;
38 }

總結(jié)

以上是生活随笔為你收集整理的斐波那契数列(公式)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。