矩阵乘法
程序员文章站
2022-07-12 09:07:57
...
问题描述
给定一个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
import java.util.*;
public class Main {
public static int[][] solve(int n1,int n2,int m,int[][] a,int[][] b){//起始幂n1,要求幂n2,阶数m,起始矩阵a,结果矩阵b
if(n1==n2)
return b;
else{
int[][] c=new int[m][m];
for(int i=0;i<m;i++){
for(int j=0;j<m;j++){
for(int p=i,q=j,r=0;r<m;r++){
c[i][j]+=a[i][r]*b[r][j];
}
}
}
return solve(n1+1,n2,m,a,c);
}
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int m=in.nextInt(),n=in.nextInt();//阶数和幂数
int[][] a=new int[m][m],b=new int[m][m];
for(int i=0;i<m;i++){
for(int j=0;j<m;j++){
a[i][j]=in.nextInt();
b[i][j]=a[i][j];
}
}
int[][] res=new int[m][m];
if(n==0){
for(int i=0;i<m;i++){//幂数为0
for(int j=0;j<m;j++){
if(i==j)
res[i][j]=1;
else
res[i][j]=0;
}
}
}
else{//幂数不为0
res=solve(1,n,m,a,b);
}
for(int i=0;i<m;i++){
for(int j=0;j<m;j++){
if(j==m-1)
System.out.println(res[i][j]);
else
System.out.print(res[i][j]+" ");
}
}
}
}
这里给出的代码是用尾递归写的,当然也可以在主函数里直接用循环来写。
特别需要注意的是,当幂数n=0时,最终的结果矩阵应该是n阶单位矩阵,这种情况需要另外进行判断。
推荐阅读