首先一般会定义一个结构体
struct matrix
{
int a[n][m];
};
2*2的矩阵直接可以用两个for
matrix mul(matrix a, matrix b)
{
matrix ret;
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
ret.a[i][j] = (a.a[i][0]*b.a[0][j]+a.a[i][1]*b.a[1][j]);
}
}
return ret;
}
接下来就是O(n^3)的算法(如l*n的矩阵与n*m的矩阵相乘)
matrix mul(matrix a, matrix b)
{
matrix ret;
for(int i=0;i<l;i++)
{
for(int j=0;j<m;j++)
{
ret.a[i][j]=0;
for(int k=0;k<n;k++)
{
ret.a[i][j] += a.a[i][k]*b.a[k][j];
}
}
}
return ret;
}
这个简单易懂,但是效率不太高,极易超时
以下是效率较高的
matrix mul(matrix a, matrix b)
{
matrix ret;
for(int i=0;i<l;i++)
{
for(int j=0;j<m;j++)
{
ret.a[i][j]=0;
}
} //初始化必不可少
for(int i=0;i<l;i++)
{
for(int k=0;k<n;k++)
{
if(a.a[i][k])
{
for(int j=0;j<m;j++)
{
if(b.a[k][j])
ret.a[i][j]+=a.a[i][k]*b.a[k][j];
}
}
}
}
return ret;
}
综上,大致可以写成(以2*2的矩阵为例)
#include <iostream>
using namespace std;
struct matrix
{
int a[2][2];
};
matrix mul(matrix a, matrix b)
{
matrix ret;
for(int i=0;i<2;i++)
{
for(int j=0;j<m;j++)
{
ret.a[i][j] = a.a[i][0]*b.a[0][j]+a.a[i][1]*b.a[1][j];
}
}
return ret;
}
matrix mpower(matrix a, int n)
{
matrix I;
I.a[0][0] = I.a[1][1] = 1;
I.a[0][1] = I.a[1][0] = 0;
//将I初始化为单位矩阵
while(n)
{
if(n&1) I = mul(I,a);
a = mul(a,a);
n>>=1;
}
return I;
}
int main()
{
cin//先输入
//然后初始化矩阵 ,假设n个tmp矩阵相乘
tmp = mpower(tmp,n);
//输出矩阵中的数
return 0;
}