给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
例如:
A =
1 2
3 4
A的2次幂
7 10
15 22
Input Description
第一行是一个正整数N、M(1< =N< =30, 0< =M< =5),表示矩阵A的阶数和要求的幂数
接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值
Output Description
输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开
Sample Input
2 2
1 2
3 4
Sample Output
7 10
15 22
```#include
int main()
{
int m, n, i, j, k, l;
int a[50][50] = {0};
int b[50][50] = {0};
int c[50][50] = {0};
scanf("%d %d", &n, &m);
for( i = 0; i < n; i++ )
{
for( j = 0; j < n; j++ )
{
scanf("%d", &a[i][j]);
c[i][j] = a[i][j];
b[i][j] = 0;
}
}
while(--m)
{
for( i = 0; i < n; i++ )
{
for( j = 0; j < n; j++ )
{
for( k = 0; k < n; k++ )
{
b[i][j] = b[i][j] + a[i][k] * c[k][j];
}
}
}
for( i = 0; i < n; i++ )
{
for( j = 0; j < n; j++ )
{
c[i][j] = b[i][j];
b[i][j] = 0;
}
}
}
for( i = 0; i < n; i++ )
{
for( j = 0; j < n; j++ )
{
if( j == 0 )
printf("%d", c[i][j]);
else
printf(" %d", c[i][j]);
}
printf("\n");
}
return 0;
}
这个提交显示超时咋办,求大佬指点
https://blog.csdn.net/cprimesplus/article/details/89054148
#includeint multiply(int a[30][30],int b[30][30],int c[30][30],int n,int m){ int i,j; int k;//记录次数(幂次) int h=0;//h,i,j,分别记录行,列(行),列 int sum;//记录的是行列乘积的值的和 //计算的是0次幂,则直接返回的是单位矩阵 if(m==0) { for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(i==j) c[i][j]=1; else c[i][j]=0; } } return 0; } //计算1次幂的情况 if(m==1) { for(i=0;i<n;i++) { for(j=0;j<n;j++) { c[i][j]=a[i][j]; } } return 0; } //接下来开始计算,2~5次幂的情况 k=1; while(k<=m) { for(h=0;h<n;h++) {//控制的是数组a[]的行,也是c[]的行,在确定c[]中的两个数(同一行的情况下)是不变的 //i表示的是列(行),j表示的是(列) for(j=0;j<n;j++)//j控制的是b[]的列,在确定c[]中的一个数的时候,是不变的 { sum=0;//因为每个数在开始求之前,都要对sum进行更新,所以sum的置0,应该放在此处 for(i=0;i<n;i++)//i控制的是a[]的列,b[]的行,在求c[]中的一个数的时候,是需要逐渐变大的 { sum+=a[h][i]*b[i][j]; } c[h][j]=sum; } } k++;//乘完一遍的时候,是2次幂 if(k<m)//幂的次数还不够 { for(i=0;i<n;i++) { for(j=0;j<n;j++) { b[i][j]=c[i][j]; } } } } return 0;}int main(){ int m,n; scanf("%d %d",&n,&m); int a[30][30]; int b[30][30]; int c[30][30]; int i,j; for(i=0;i<n;i++) { for(j=0;j<n;j++) { scanf("%d",&a[i][j]); b[i][j]=a[i][j]; } } // for(i=0;i<n;i++)// {// for(j=0;j<n;j++)// {// printf("%d",a[i][j]);// }// } multiply(a,b,c,n,m);//调用乘方函数 for(i=0;i<n;i++)//输出 { for(j=0;j<n;j++) { printf("%d ",c[i][j]); } printf("\n"); } return 0; }