题目 1472: [蓝桥杯][基础练习VIP]矩阵乘法
时间限制: 1Sec 内存限制: 128MB 提交: 2368 解决: 706
题目描述
给定一个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.Scanner;
public class Main{
static int max=30;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//输入矩阵的阶数,以及乘方数
int m=sc.nextInt();
int n=sc.nextInt();
int begin[][]=new int[max][max];//数组begin用于存放原数组
int end[][]=new int[max][max];//数组end用于存放每次运算后的乘积
int middle[][]=new int[max][max];//数组middle起桥梁作用每次运算将数组end复制进去再与数组begin相乘
//输入原矩阵并将复制到end矩阵
for(int i=0;i<m;i++)
for(int j=0;j<m;j++) {
end[i][j]=sc.nextInt();
begin[i][j]=end[i][j];
}
/*如果输入的次方数为0,即计算矩阵的0次方
* 就将矩阵正对角线上的数置为1,其余置为0处理*/
if(n==0) {
for(int i=0;i<m;i++)
for(int j=0;j<m;j++) {
if(i==j)end[i][j]=1;
else end[i][j]=0;
}
}
//如果不是0次方就以循环的方式计算乘方
else {
for(int i=1;i<n;i++)
summition(end,begin,middle,m);
}
//打印最终矩阵end
for(int i=0;i<m;i++) {
for(int j=0;j<m;j++)
System.out.print(end[i][j]+" ");
System.out.println();
}
}
//每一次调用都将数组a复制到数组c中,数组b永久保持不变
//然后将数组c与数组b的乘积代入数组a,以实现数组b乘方运算
//a为目标矩阵,b为初始矩阵
public static void summition(int a[][],int b[][],int c[][],int n) {
//先将a的初始数组存放到数组c中
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
c[i][j]=a[i][j];
//然后将数组c与数组b的乘积代入数组a
for(int i=0;i<n;i++)
for(int j=0;j<n;j++) {
a[i][j] = 0;
for(int k=0;k<n;k++)
a[i][j]+=c[i][k]*b[k][j];
}
return;
}
}