给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
例如:
A=
1 2
3 4
A的二次幂
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
代码
#include <stdio.h>
int main() {
int A[30][30],S[30][30], B[30][30], N, M, i, j;//A为相乘矩阵右边的矩阵,S为相乘矩阵左边的矩阵,B为相乘后的矩阵
scanf("%d %d",&N,&M);
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
scanf("%d",&A[i][j]);
}
}
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
S[i][j] = A[i][j];
}
}//第一次相乘左右两边矩阵相等,所以令S=A
if (M == 0) {//考虑特殊情况
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
if (i == j) {
B[i][j] = 1;
}
else {
B[i][j] = 0;
}
}
}
}else{
if (M == 1) {/考虑特殊情况
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
B[i][j] = A[i][j];
}
}
}
else {
while (M>1) {//一般情况
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
B[i][j] = 0;
}
}//每次相乘时都先令结果矩阵的每个元素为0
int a, b, c;//右边矩阵的列数 右边矩阵的行数=左边矩阵的列数 左边矩阵的行数
for (a = 0; a < N; a++) {
c = 0;
while (c < N) {
for (b = 0; b < N; b++) {
B[c][a] += (S[c][b] * A[b][a]);
}
c++;
}
}
M--;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
S[i][j] = B[i][j];
}
}//每次计算完成,令左边矩阵=结果矩阵,方便下次计算
}
}
}
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
printf("%d", B[i][j]);
if (j != N - 1) {
printf(" ");
}
}
if(i!=N-1){
printf("\n");
}
}
return 0;
}