• 蓝桥训练系统 矩阵乘法


    问题描述

      给定一个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  }
  • 相关阅读:
    2016年3月至9月随笔
    带大三个hybird app项目的设计管理笔记
    小议新人的培养
    GitHub上整理的一些工具,求补充——转的,先mark了
    AutoMapper(一)——实现数据契约和实体类之间的转换
    GitHub上整理的一些工具
    我最常用的7个Web在线工具
    在线团队协作工具+在线UML工具
    轻量级SaaS在线作图工具(继之前介绍后完整介绍)
    分享自己使用的在线UML画图工具
  • 原文地址:https://www.cnblogs.com/yuanqingwen/p/10498402.html
Copyright © 2020-2023  润新知