求以下问题的完整代码

描述
给你一个NN的矩阵A,计算矩阵A的K次方。
也就是计算A
A…A(K个A)。
假设A、B、C都是矩阵,有A
B=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

img

运行结果:

img

代码:

#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;
}

img

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632