描述
给你一个NN的矩阵A,计算矩阵A的K次方。
也就是计算AA…A(K个A)。
假设A、B、C都是矩阵,有AB=C,那么C[i][j] = Sum(A[i][k]*B[k][j]), k从0到n-1。
输入
第一行为矩阵的阶数N,以及K次方。
接下来N行,每行有N个数,分别用空格分开。代表矩阵A。
其中1<=N,K<=7,且矩阵A种每个元素 a满足: 1<=a<=7。
输出
输出一个N*N的矩阵,代表计算结果
样例
输入 输出
3 22 1 52 5 77 3 3 41 22 3263 48 6641 31 65
运行结果:
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
//求N*N矩阵的k次方
double** MatrixPow(int** a, int n, int k)
{
int i, j, t, m;
double** p = 0;
double** q = 0;
p = (double**)malloc(sizeof(double*) * n);
q = (double**)malloc(sizeof(double*) * n);
for (i = 0; i < n; i++)
{
p[i] = (double*)malloc(sizeof(double) * n);
q[i] = (double*)malloc(sizeof(double) * n);
for (j = 0; j < n; j++)
p[i][j] = a[i][j];
}
if (k == 1)
return p;
//a中已经是1次方,所以再计算K-1次就可以了
for (t = 1; t <= k - 1; t++)
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
q[i][j] = 0; //借助中间变量,避免对结果产生影响
for (m = 0; m < n; m++)
q[i][j] += p[i][m] * a[m][j];
}
}
//将计算结果重新放回a
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
p[i][j] = q[i][j];
}
}
//释放内存
for (i = 0; i < n; i++)
{
free(q[i]); q[i] = 0;
}
free(q); q = 0;
return p;
}
int main()
{
int N, K,i,j;
int** p;
double** res;
scanf("%d %d", &N, &K);
p = (int**)malloc(sizeof(int*) * N);
for (i = 0; i < N; i++)
{
p[i] = (int*)malloc(sizeof(int) * N);
for (j = 0; j < N; j++)
scanf("%d", &p[i][j]);
}
res = MatrixPow(p, N, K);
//显示结果
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
if (j < N - 1)
printf("%.0f ", res[i][j]);
else
printf("%.0f\n",res[i][j]);
}
}
//释放内存
for (i = 0; i < N; i++)
{
free(p[i]); p[i] = 0;
free(res[i]); res[i] = 0;
}
free(p); p = 0;
free(res); res = 0;
return 0;
}
封装一个矩阵相乘的函数,然后循环调用就行了
#include <stdio.h>
void mul(int a[][7],int b[][7],int n)
{
int c[7][7] = {0};
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int k=0;k<n;k++)
c[i][j] += a[i][k] * b[k][j];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
a[i][j] = c[i][j];
}
}
int main()
{
int N,K,i,j;
int a[7][7],b[7][7];
scanf("%d%d",&N,&K);
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<K-1;i++)
mul(a,b,N);
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}