蓝桥杯 基础练习 矩阵乘法
问题描述 给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
例如:
A =
1 2
3 4
A的2次幂
7 10
15 22
输入格式 第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数
接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值
输出格式 输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开
样例输入
2 2
1 2
3 4
样例输出
7 10
15 22
int multiply(int a[30][30],int b[30][30],int c[30][30],int n,int m)
{
int i,j;
int k;//记录次数(幂次)
int h=0;//h,i,j,分别记录行,列(行),列
int sum;//记录的是行列乘积的值的和
//计算的是0次幂,则直接返回的是单位矩阵
if(m==0)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==j)
c[i][j]=1;
else
c[i][j]=0;
}
}
return 0;
}
//计算1次幂的情况
if(m==1)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
c[i][j]=a[i][j];
}
}
return 0;
}
//接下来开始计算,2~5次幂的情况
k=1;
while(k<=m)
{
for(h=0;h<n;h++)
{//控制的是数组a[]的行,也是c[]的行,在确定c[]中的两个数(同一行的情况下)是不变的
//i表示的是列(行),j表示的是(列)
for(j=0;j<n;j++)//j控制的是b[]的列,在确定c[]中的一个数的时候,是不变的
{
sum=0;//因为每个数在开始求之前,都要对sum进行更新,所以sum的置0,应该放在此处
for(i=0;i<n;i++)//i控制的是a[]的列,b[]的行,在求c[]中的一个数的时候,是需要逐渐变大的
{
sum+=a[h][i]*b[i][j];
}
c[h][j]=sum;
}
}
k++;//乘完一遍的时候,是2次幂
if(k<m)//幂的次数还不够
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
b[i][j]=c[i][j];
}
}
}
}
return 0;
}