题目描述
给定一个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的值
输入样例:
2 2
1 2
3 4
输出
输出描述:
输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开
输出样例:
7 10
15 22
HINT:时间限制:1.0s 内存限制:512.0MB
解题思路
主要就是搞懂矩阵的乘法就行, 就是用第一个矩阵的行来依次乘以第二个矩阵的列然后再相加就得到了新矩阵的一个元素,之后就是循环行的运算了,还有就是要考虑幂的次数是0次和1次的时候。
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int m=scanner.nextInt();//接收矩阵的阶数和幂数
int n=scanner.nextInt();
long [][] p=new long[m][m];//定义二阶数组来接收矩阵
long [][] q=new long[m][m];
for (int i=0;i<m;i++){
//输入矩阵的数
for (int j=0;j<m;j++){
q[i][j]=p[i][j]=scanner.nextLong();
}
}
if (n==0){
//若为0阶的话 主对角线为1 其余的都为0
for (int i=0;i<m;i++){
for (int j=0;j<m;j++){
if (i==j){
System.out.print(1+" ");
}else {
System.out.print(0+" ");
}
}
System.out.println();
}
}
else if (n==1){
//若为1阶就输出原矩阵就行
for (int i=0;i<m;i++){
for (int j=0;j<m;j++){
System.out.print(p[i][j]+" ");
}
System.out.println();
}
}
else {
//若阶数大于1
for (int x=1;x<n;x++){
long [][] num=new long[m][m];//定义一个新的二阶数组来当作中转矩阵
for (int i=0;i<m;i++){
for (int j=0;j<m;j++){
//一行一行的算
long y=0;//定义一个值来接收计算后的数值 因为矩阵的乘法是第一个矩阵的行乘以第二个矩阵的列的和 得到一个值
for (int k=0;k<m;k++){
y+=p[i][k]*q[k][j];
}
num[i][j]=y;//放入中转数组
}
}
q=num;//结束之后再替换
}
for (int i=0;i<m;i++){
//输出最后的值
for (int j=0;j<m;j++){
System.out.print(q[i][j]+" ");
}
System.out.println();
}
}
}
}