蓝桥杯练习 矩阵乘法
问题描述
给定一个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
思路分析:矩阵的乘法如a*b = c,那么c的第i行第j列元素是a的第i行逐个与b的第j列相乘再相加得到的。
那么矩阵的乘法就按照这个思路去写,第一个函数输入两个相乘的矩阵,输出相乘后的矩阵。第一个函数内部又需要一个输入第i行第j列,得到a的第i行逐个与b的第j列相乘再相加的值,作为相乘后的矩阵的第i行第j列元素。
代码如下:
import java.util.*;
public class Main {
public static void main(String[] args) {
//数据的输入
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[][] arr = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
arr[i][j] = sc.nextInt();
}
}
//当m为0时,输出单位矩阵
if(m == 0){
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if(i == j){
System.out.print("1 ");
}else {
System.out.print("0 ");
}
}
System.out.println();
}
return;
}
//m为1时输出原矩阵
if(m==1){
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
return;
}
//输出矩阵的m次方
int[][] res = matrixFun(arr,arr);
for (int i = 2; i <m; i++) {
res = matrixFun(res,arr);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(res[i][j]+" ");
}
System.out.println();
}
}
//矩阵和矩阵相乘
private static int[][] matrixFun(int[][]arr1,int[][] arr2) {
int[][] res = new int[arr2.length][arr2.length];
for (int i = 0; i < arr2.length; i++) {
for (int j = 0; j < arr2.length; j++) {
res[i][j] = getRes(i,j,arr1,arr2);
}
}
return res;
}
//输入第i行第j列,计算出第i行第j列位置的值
private static int getRes(int i, int j,int[][]arr1, int[][] arr2) {
int sum = 0;
for(int k = 0;k<arr2.length;k++){
sum += arr1[i][k]*arr2[k][j];
}
return sum;
}
}