求矩阵的n次方 c语言实现

矩阵的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]);
}    
}