zoukankan      html  css  js  c++  java
  • 矩阵乘法

    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
Copyright © 2011-2022 走看看