package jiChu;
import java.util.Scanner;
/**
* 问题描述 给定一个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
*
* @author Vivinia
*
* 2018年1月25日
*/
public class JuMul {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int N = input.nextInt();
int M = input.nextInt();
long a[][] = new long[N][N]; //原始数据
long c[][] = new long[N][N]; //最终结果
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
c[i][j] = a[i][j] = input.nextInt();
input.close();
int temp = 1; //M不等于1,进行循环
while (M != temp && M != 0) {
long b[][] = new long[N][N]; //暂时存储
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
for (int k = 0; k < N; k++)
b[i][j] += c[i][k] * a[k][j];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
c[i][j] = b[i][j];
}
temp++; //幂的递增变量,幂数代表循环次数
}
if (M == 0) { //M等于1,直接设置数据
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
if (i == j)
c[i][j] = 1; //左上右下对角线为1
else
c[i][j] = 0;
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
System.out.print(c[i][j] + " ");
System.out.println();
}
}
}
题意很不好理解,牵扯到了线代的内容,百度了一下矩阵的乘积,主要是这一段代码:
1.幂数不为1:
int temp = 1; //M不等于1,进行循环
while (M != temp && M != 0) {
long b[][] = new long[N][N]; //暂时存储
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
for (int k = 0; k < N; k++)
b[i][j] += c[i][k] * a[k][j];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
c[i][j] = b[i][j];
}
temp++; //幂的递增变量,幂数代表循环次数
}
2.幂数为1:
if (M == 0) { //M等于1,直接设置数据
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
if (i == j)
c[i][j] = 1; //左上右下对角线为1
else
c[i][j] = 0;
}
样例中结果7(1*1+2*3),10(1*2+2*4),15(1*3+3*4),22(2*3+4*4)