矩阵的n次方,比较容易理解的想法是递归。
思路是这样的,把n分成两部分,当n是偶数的时候,即为左右两边的乘积,如果n是奇数,即为左右两边的乘积再乘a
if(n%2) matrixn(int* a,int n)=(matrixn(int* a,int n/2))^2*a else matrixn(int* a,int n)=(matrixn(int* a,int n/2))^2
下面列一下具体代码
#include <stdio.h> #include <stdlib.h> #include <algorithm> void copyMatrix(int* to,int *from){ for(int i=0;i<5;i++){ for(int j=0;j<5;j++){ to[i*5+j]=from[i*5+j]; } } } void Multiply(int *pMatrixA,int *pMatrixB,int col,int *pMatrixC) { int i,j,n; int fSum = 0; int fTemp = 0; for(i = 0; i < col; i++) { for(j = 0; j < col; j++) { for(n = 0; n < col; n++) { fTemp = pMatrixA[i * col + n] * pMatrixB[n * col + j]; fSum += fTemp; } pMatrixC[i * col +j] = fSum; fSum = 0; } } copyMatrix(pMatrixA,pMatrixC); } void matrixn(int* a,int* result,int n) { int C[5][5]={0};//C是用来进行矩阵累乘的数组 if(n==1) copyMatrix(result,a); else{ int ret=n % 2; matrixn(a,result,n/2); Multiply(result,result,5,&C[0][0]); if(ret){ Multiply(result,a,5,&C[0][0]); } } } void main(){ int A[5][5]={{1,1,1,1,1},{1,1,1,1,1},{1,1,1,1,1},{1,1,1,1,1},{1,1,1,1,1}}; int C[5][5]={0}; matrixn(&A[0][0],&C[0][0],5); for(int i=0;i<5;i++){ printf("\n"); for(int j=0;j<5;j++) printf("%d ",C[i][j]); } }