题目
给定一个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
解题思路
直接按照矩阵的乘法计算即可,为了节约一点运行时间,将2的n次方次幂先计算,再计算剩下(M-2n)次即可。
易错点
M是非负整数,M是0的时候要输出单位矩阵。
代码
#include<stdio.h>
#include<math.h>
int N;
void multiple(long int a[N][N], long int b[N][N]){
int i,j,k;
long int c[N][N];
long int temp;
for (i=0;i<N;i++)
{
for (j=0;j<N;j++)
{
temp = 0;
for (k=0;k<N;k++)
temp += a[i][k]*b[k][j];
c[i][j] = temp;
}
}
for (i=0;i<N;i++)
for (j=0;j<N;j++)
a[i][j] = c[i][j];
}
int main()
{
int M,i,j;
scanf("%d %d",&N,&M);
int k=1;
long int a[N][N],b[N][N];
for (i=0;i<N;i++)
{
for (j=0;j<N;j++)
{
scanf("%ld",&a[i][j]);
b[i][j] = a[i][j];
}
}
if (M!=0)
{
while ((k*2)<=M){//先不断乘方
multiple(a,a);
k*=2;
}
for (i=k+1;i<=M;i++)//补齐剩下的次数
multiple(a,b);
}
else
{
for (i=0;i<N;i++)
for (j=0;j<N;j++)
a[i][j] = (i==j)? 1:0;
}
for (i=0;i<N;i++)
{
for (j=0;j<N;j++)
{
if (j!=0)
printf(" ");
printf("%ld",a[i][j]);
}
printf("\n");
}
return 0;
}