zoukankan      html  css  js  c++  java
  • 蓝桥训练系统 矩阵乘法

    问题描述

      给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
      例如:
      A =
      1 2
      3 4
      A的2次幂
      7 10
      15 22
    输入格式
      第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数
      接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值
    输出格式
      输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开
    样例输入
    2 2
    1 2
    3 4
    样例输出
    7 10
    15 22
    矩阵乘法规则加上中间数组桥梁作用就可以解决这个问题,但还是思考了很久。
    代码实现:
     1 #include<stdio.h>
     2 int a[35][35],b[35][35],c[35][35]; 
     3  int  main()
     4  {
     5      int N,M,i;
     6      scanf("%d%d",&N,&M);
     7      
     8      
     9          for(i=0;i<N;i++)
    10      {
    11          for(int j=0;j<N;j++)
    12          scanf("%d",&a[i][j]);
    13      }
    14      
    15      
    16      for(int i=0;i<N;i++)
    17      {
    18          for(int j=0;j<N;j++)
    19              b[i][j]=a[i][j];
    20      }
    21  
    22      
    23     if(M==0)
    24     {
    25         for(i=0;i<N;i++)
    26          c[i][i]=1;//单位矩阵主对角线的所有值为一; 
    27     }
    28     else if(M==1)
    29     {
    30             for(int x=0;x<N;x++)
    31         {
    32             for(int y=0;y<N;y++)
    33              c[x][y]=b[x][y];
    34         }
    35     }
    36     else if(M>=2)
    37     {
    38        for(int k=0;k<M;k++)//本身下来一次就可以充当一次幂了;在下来一次就是二次; 
    39         {
    40             for(int x=0;x<N;x++)
    41             {
    42                 for(int y=0;y<N;y++)
    43                 {
    44                         c[x][y]=b[x][y];
    45                         b[x][y]=0;
    46                 }    
    47             }
    48                for(int i=0;i<N;i++)
    49             {    
    50                 for(int j=0;j<N;j++)
    51                 {   
    52                     for(int t=0;t<N;t++)
    53                     {
    54                         b[i][j]+=a[i][t]*c[t][j];//前一次矩阵乘法之后与原矩阵的乘法,需要中间数组b来当作桥梁 ,不能直接用a因为会改变原输入数组的值; 
    55                     }
    56                 }
    57             }
    58         }
    59     }
    60     
    61      for(int i=0;i<N;i++)
    62     {
    63         for(int j=0;j<N;j++)
    64         {
    65             printf("%d ",c[i][j]);
    66         }
    67         printf("
    ");
    68     }
    69 
    70      
    71 return 0;
    72  }
  • 相关阅读:
    C++ 将对象写入文件 并读取
    IronPython fail to add reference to WebDriver.dll
    How to Capture and Decrypt Lync Server 2010 TLS Traffic Using Microsoft Tools
    .net code injection
    数学系学生应该知道的十个学术网站
    Difference Between Currency Swap and FX Swap
    Swift开源parser
    谈谈我对证券公司一些部门的理解(前、中、后台)[z]
    JDK8记FullGC时候Metaspace内存不会被垃圾回收
    JVM源码分析之JDK8下的僵尸(无法回收)类加载器[z]
  • 原文地址:https://www.cnblogs.com/yuanqingwen/p/10498402.html
Copyright © 2011-2022 走看看