矩阵相乘
真题输入两个矩阵,a,b,输出矩阵相乘的结果c
#include <stdio.h>
#define N 100
int a[N][N],b[N][N],c[N][N];
int m,n,k;
int multi(int u,int v){
int sum=0;
for(int j=0;j<m;j++) {
sum+=(a[u][j]*b[j][v]);
}
return sum;
}
int main(){
scanf("%d",&n);
scanf("%d",&m);
scanf("%d",&k);
for(int i=0;i<n;i++){//输入n*m的矩阵
for(int j=0;j<m;j++)
scanf("%d",&a[i][j]);
}
for(int i=0;i<m;i++){//输入m*k的矩阵
for(int j=0;j<k;j++)
scanf("%d",&b[i][j]);
}
for(int i=0;i<n;i++){
for(int j=0;j<k;j++)
c[i][j]=multi(i,j);
}
for(int i=0;i<n;i++){
for(int j=0;j<k;j++)
printf("%d ",c[i][j]);
printf("\n");
}
}
矩阵快速幂
n个N阶矩阵相乘 A的n次方 复杂度O(N^3logn)
#include <stdio.h>
#define N 100
int** multi(int **a,int **b)
{
int c[N][N]={[0 ... (N-1)][0 ... (N-1)] =0 }; /* 100*100个元素都初始化为10 */
//memset(c.m,0,sizeof(c.m));
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
for(int k=0;k<N;k++)
c[i][j]+=a[i][k]*b[k][j];
return c;
}
int** pow_matrix(int** a,int n)
{
int c[N][N]={[0 ... (N-1)][0 ... (N-1)] =1 };
while(n)
{
if(n&1)
c=multi(c,a);
n>>=1;
}
return c;
}
int main(){
int a[N][N];
int m,n;
scanf("%d",&n);
scanf("%d",&m);
// scanf("%d",&k);
for(int i=0;i<n;i++){//输入n*m的矩阵
for(int j=0;j<m;j++)
scanf("%d",a[i][j]);
}
pow_matrix(a,3);
}
忘记了二维数组的传递和返回啊啊啊,搞了半天没搞出来,求助大佬。
神奇应用:矩阵快速幂加速递推
根据递推关系改写,在纸上算出A矩阵,然后利用快速幂,计算A的n次方的左下角就是斐波那契数列的Fn。