3006 - 【验证型】第11章:指针和数组 矩阵相乘
给定一个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次幂所对应的矩阵。相邻的数之间用一个空格隔开(结尾不要输出多于的空格)
Examples
Input
2 2 1 2 3 4
Output
7 10 15 22
Solution C++
#include<stdio.h> #include<iostream> #include<stdlib.h> using namespace std; int main() { int N, M; cin >> N >> M; int *Array = (int *)calloc(N*N, sizeof(int)); int *R_Array = (int *)calloc(N*N, sizeof(int)); int *R = (int *)calloc(N*N, sizeof(int)); for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { cin >> Array[i*N+j]; R_Array[i*N+j] = Array[i*N+j]; R[i*N+j] = Array[i*N+j]; } } if(M == 0) { for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { if(i == j) R_Array[i*N+j] = 1; else R_Array[i*N+j] = 0; } } } else { for(int k = 1; k < M; k++) { for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { R[i*N+j] = 0; for(int r = 0; r < N; r++) { R[i*N+j] += R_Array[i*N+r] * Array[r*N+j]; } } } for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { R_Array[i*N+j] = R[i*N+j]; } } } } for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { if(j == N-1) { cout << R_Array[i*N+j]; break; } cout << R_Array[i*N+j] << " "; } cout << endl; } free(Array); free(R_Array); free(R); return 0; }