矩阵乘法

Description


给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
  例如:
  A =
  1 2
  3 4
  A的2次幂
  7 10
  15 22


Input


第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数。


接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值。

Output

输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开。

 

Sample Input

2 2
1 2
3 4

Sample Output

7 10
15 22


 1 #include<iostream>
 2 using namespace std;
 3 int main(){
 4     int n,m;
 5     scanf("%d%d",&n,&m);
 6     int a[100][100],b[100][100],c[100][100];
 7     for(int i=1;i<=n;i++){//输入a矩阵时,b矩阵也赋一样的值 
 8         for(int j=1;j<=n;j++){
 9             scanf("%d",&a[i][j]);
10             b[i][j]=a[i][j];
11         }
12     }
13     if(m==0){//如果是零次幂,就输出单位矩阵 
14         for(int i=1;i<=n;i++){
15             for(int j=1;j<=n;j++){
16                 if(i==j)
17                     c[i][j]=1;
18                 else
19                     c[i][j]=0;    
20                 printf("%d ",c[i][j]);
21             }
22         }
23         printf("
");
24         return 0;
25     }
26     if(m==1){//如果是1次幂,就输出自身 
27         for(int i=1;i<=n;i++){
28             for(int j=1;j<=n;j++){
29                 printf("%d ",a[i][j]);
30             }
31             printf("
");
32         }
33         return 0;
34     }
35     //如果是多次幂 
36     for(int time=1;time<m;time++){//如果是m次幂,就进行m-1次乘法 
37         for(int i=1;i<=n;i++){//矩阵的行 
38             for(int j=1;j<=n;j++){//矩阵的列 
39                 int sum=0;//用来盛放一行乘一列的总和 
40                 for(int k=1;k<=n;k++){//一行乘一列 
41                     sum+=a[i][k]*b[k][j];
42                 }
43                 c[i][j]=sum;//一行乘一列完后,赋值给数组c相应位置 
44             }
45         }
46         for(int i=1;i<=n;i++){//完成一次乘法后 
47             for(int j=1;j<=n;j++){//将c数组复制到b数组 
48                 b[i][j]=c[i][j];//b数组再继续和a数组相乘 
49             }
50         }
51     }
52     for(int i=1;i<=n;i++){//最后输出c数组 
53         for(int j=1;j<=n;j++){
54             printf("%d ",c[i][j]);
55         }
56         printf("
");
57     }
58     return 0;
59 }

首先得知道矩阵怎样作乘法,核心代码是这个

    for(int time=1;time<m;time++){//如果是m次幂,就进行m-1次乘法 
        for(int i=1;i<=n;i++){//矩阵的行 
            for(int j=1;j<=n;j++){//矩阵的列 
                int sum=0;//用来盛放一行乘一列的总和 
                for(int k=1;k<=n;k++){//一行乘一列 
                    sum+=a[i][k]*b[k][j];
                }
                c[i][j]=sum;//一行乘一列完后,赋值给数组c相应位置 
            }
        }
        for(int i=1;i<=n;i++){//完成一次乘法后 
            for(int j=1;j<=n;j++){//将c数组复制到b数组 
                b[i][j]=c[i][j];//b数组再继续和a数组相乘 
            }
        }
    }

理解好这个!

O(∩_∩)O







原文地址:https://www.cnblogs.com/fate-/p/12271989.html