Description 給定一個N階矩陣A,輸出A的M次冪(M是非負整數) 例如: A = 1 2 3 4 A的2次冪 7 10 15 22
Input 第一行是一個正整數N、M(1<=N<=30, 0<=M<=5),表示矩陣A的階數和要求的冪數 接下來N行,每行N個絕對值不超過10的非負整數,描述矩陣A的值 Output 輸出共N行,每行N個整數,表示A的M次冪所對應的矩陣。相鄰的數之間用一個空格隔開
關鍵思路: spa
C[i][j] += B[i][k] * A[k][j]; // 矩陣乘積的關鍵
while (M>1) { // 計算第一次 for (i=1; i<=N; i++) { for (j=1; j<=N; j++) { for (k=1; k<=N; k++) { C[i][j] += B[i][k] * A[k][j]; } } } // B 保存C中元素,C置零 for (i=1; i<=N; i++) { for (j=1; j<=N; j++) { B[i][j] = C[i][j]; C[i][j] = 0; } } M--; }
實現代碼:code
# include <stdio.h> # define Max 32 int main(void) { int N; // 記錄矩陣的維度 int M; // 乘積次數 int i, j, k; int A[Max][Max] = {0}; int B[Max][Max] = {0}; int C[Max][Max] = {0}; scanf("%d",&N); scanf("%d",&M); if (N<1 || N>30 || M<0 || M>5) return 0; // 輸入矩陣的元素 for (i=1; i<=N; i++) { for (j=1; j<=N; j++) { scanf("%d",&A[i][j]); if (A[i][j]<0 || A[i][j]>10) return 0; B[i][j] = A[i][j]; C[i][j] = 0; } } // 矩陣的乘積運算 while (M>1) { // 計算第一次 for (i=1; i<=N; i++) { for (j=1; j<=N; j++) { for (k=1; k<=N; k++) { C[i][j] += B[i][k] * A[k][j]; } } } // B 保存C中元素,C置零 for (i=1; i<=N; i++) { for (j=1; j<=N; j++) { B[i][j] = C[i][j]; C[i][j] = 0; } } M--; } // 輸出矩陣 for (i=1; i<=N; i++) { for (j=1; j<=N; j++) { printf("%d",B[i][j]); if(j != N) printf(" "); } if (i != N) printf("\n"); } return 0; }