使用直接公式打印前 n 个斐波那契数

什么是斐波那契数列?

斐波那契数列是一种数学上的序列,其中每个数字都是前两个数字的和。斐波那契数列的前几个数字为:0, 1, 1, 2, 3, 5, 8, 13, 21, 34……

斐波那契数列中的数字有很多有趣的应用,比如在自然界中常见的菜花、向日葵等,它们的花瓣数就是斐波那契数列中的数字。此外,斐波那契数列还应用于金融、生物学等领域。

如何使用直接公式计算斐波那契数列?

使用公式

斐波那契数列的通项公式为:

其中 Fn 表示第 n 个斐波那契数。

该公式虽然简单,但计算效率不高,因为需要进行开方和幂运算。下面介绍一种更高效的计算方法——矩阵快速幂。

使用矩阵快速幂

矩阵快速幂是一种高效的算法,可以用于快速计算任意次幂。在计算斐波那契数列时,可以利用矩阵快速幂的思想,将其转化为矩阵的形式。

斐波那契数列的递推式为:

我们可以把斐波那契数列的前两个数写成一个向量:

然后,将递推式表示成矩阵形式:

这样,我们就可以利用矩阵快速幂的算法,快速计算出斐波那契数列。

#include

#include

using namespace std;

const int MOD = 998244353;

const int maxn = 3;

//矩阵乘法

void matmul(long long a[maxn][maxn],long long b[maxn][maxn])

{

long long ans[maxn][maxn] = {0};

for(int i = 1 ; i <= 2 ; i++){

for(int j = 1 ; j <= 2 ; j++){

for(int k = 1 ; k <= 2 ; k++){

ans[i][j] += a[i][k] * b[k][j];

ans[i][j] = ans[i][j] % MOD;

}

}

}

for(int i = 1 ; i <= 2 ; i++){

for(int j = 1 ; j <= 2 ; j++){

a[i][j] = ans[i][j];

}

}

return;

}

//矩阵快速幂

long long matpow(long long a[maxn][maxn],int b)

{

long long ans[maxn][maxn] = {0};

for(int i = 1 ; i <= 2 ; i++){

ans[i][i] = 1;

}

while(b != 0){

if(b & 1) matmul(ans,a);

matmul(a,a);

b >>= 1;

}

return ans[1][1];

}

int main ()

{

int n = 10;

long long a[maxn][maxn] = {0};

a[1][2] = a[2][1] = a[2][2] = 1;

printf("前 %d 个斐波那契数为:\n",n);

for(int i = 0 ; i < n ; i++){

printf("%lld ",matpow(a,i));

}

return 0;

}

总结

本文介绍了两种计算斐波那契数列的方法:直接使用通项公式和利用矩阵快速幂算法。通项公式虽然简单,但计算效率不高,而矩阵快速幂算法可以快速、高效地计算出斐波那契数列。

当然,矩阵快速幂算法并不局限于斐波那契数列的计算,它可以应用于各种快速幂计算,例如求幂、Fibonacci数列的第N项等等。

后端开发标签