1樓:計0劃0環0境
在做程式設計題目的時候經常會遇到「斐波那契數列」相關的題目,尤其在做oj中。下面說一些方法:
(一)遞迴
遞迴是最慢的會發生重複計算,時間複雜度成指數級。
long long fac(int n)
(二)迴圈
利用臨時變數來儲存中間的計算過程,加快運算。
long long fac(int n)
}return b;
}(三)矩陣乘法+空間換時間(減少乘法,取模運算)
數列的遞推公式為:f(1)=1,f(2)=2,f(n)=f(n-1)+f(n-2)(n>=3)
用矩陣表示為:
進一步,可以得出直接推導公式:
由於矩陣乘法滿足結合律,在程式中可以事先給定矩陣的64,32,16,8,4,2,1次方,加快程式的執行時間。(有些題目需要取模運算,也可以事先進行一下)。給定的矩陣次冪,與二進位制有關是因為,如下的公式存在解,滿足xi=:
為了保證解滿足 xi=,對上述公式的求解從右向左,即求解順序為xn,xn-1,xn-2,....,x1,x0。
完整**實現如下:
///求解fac(n)%100000,其中n為大於等於3的正整數
#include
#include
long long fac_tmp[6][4]=, ///32次冪%100000
, ///16次冪%100000
, ///8次冪%100000
, ///4次冪%100000
, ///2次冪%100000
, ///1次冪%100000
};void fac(int);
int main()
void fac(int k) ///k>=3
i=4;
while(i>=0) ///對於小於32的k(16,8,4,2,1);
i--;
}a=(t00*2+t01*1)%100000;
printf("%lld\n",a);}
2樓:匿名使用者
#include
typedef unsigned int uint_32;
uint_32 fibonacci(uint_32 n)return fn_1;
}int main()
return 0;}
c++簡單的遞迴函式設計(斐波那契數列)
3樓:匿名使用者
||#include "stdafx.h"
#include
using namespace std;
int f(int n)
int main()
{int i,a[12];
for (i=0;i<12;i++)
{a[i]=f(i);
cout<
4樓:溼潤的風
|||#include
long fibonacci(int n)
main()
5樓:匿名使用者
long fibo(int n)
斐波那契數列c++程式設計
6樓:
斐波那契數列就是 0 1 1 2 3 5 8 13 21 ...
除了最開始的0和1,後面每一個數都是前面兩個數相加之和。
不用遞迴就用迴圈啊。
7樓:
真服了你,遞迴也做得到n的時間複雜度的啊
很多東西用遞迴解決容易,用其他方法麻煩
8樓:匿名使用者
#include
#include
double f,n;
int main()
斐波那契數列112358132134這
斐波那契數列個位數字 十個一行 1 1 2 3 5 8 3 1 4 59 4 3 7 0 7 7 4 1 56 1 7 8 5 3 8 1 9 09 9 8 7 5 2 7 9 6 51 6 7 3 0 3 3 6 9 54 9 3 2 5 7 2 9 1 01 1 2 3 5 週期為60,而201...
求用C語言表達斐波那契數列
斐波那契數列,又稱 分割數列,指的是這樣一個數列 0 1 1 2 3 5 8 13 21 34 專 在數學上,斐波屬納契數列以如下被以遞迴的方法定義 f 0 0,f 1 1,f n f n 1 f n 2 n 2,n n 在現代物理 準晶體結構 化學等領域,斐波納契數列都有直接的應用,為此,美國數學...
用c語言求斐波那契數列第n項的值
複製貼上即可 求 fibonacci 數列第 n 個數 1 1 2 3 5 8 13 21 include void main printf d n x getchar getchar include void main printf d n f 加上括號 if n 2 printf 1 這樣改 怎...