zoukankan      html  css  js  c++  java
  • 1571:基础练习 矩阵乘法

     题目:https://acmore.cc/problem/LOCAL/1571#desc

    解法一:二维数组(因为二维数组不能作为函数的返回值,所以处理起来比较麻烦,此时推荐使用vector表示二维数组,请看解法二)

      1 #include <iostream>
      2 
      3 using namespace std;
      4 
      5 int a[30][30] = { 0 };    //初始矩阵
      6 int b[30][30] = { 0 };      //结果矩阵
      7 
      8 int getMultiSum(int a1[][30], int a2[][30], int m, int i, int j)    //计算矩阵a1的第i行与矩阵a2的第j列相乘的结果,其中a1,a2是同为m阶的方阵
      9 {
     10     int result = 0;
     11     for (int k = 0; k < m; ++k)
     12     {
     13         result += a1[i][k] * a2[k][j];
     14     }
     15     return result;
     16 }
     17 
     18 
     19 int main()
     20 {
     21     int N, M; //N表示矩阵的阶数,M表示幂
     22     while (cin >> N >> M)
     23     {
     24         for (int i = 0; i < N; ++i)
     25             for (int j = 0; j < N; ++j)
     26                 cin >> a[i][j];
     27 
     28         switch (M)
     29         {
     30         case 0:        //矩阵的零次方是单位矩阵
     31             for (int i = 0; i < N; ++i)
     32                 b[i][i] = 1;
     33             break;
     34 
     35         case 1:
     36             for (int i = 0; i < N; ++i)
     37                 for (int j = 0; j < N; ++j)
     38                     b[i][j] = a[i][j];
     39         
     40         case 2:
     41             for (int i = 0; i < N; ++i)    //i表示原矩阵的行
     42             {
     43                 for (int j = 0; j < N; ++j)    //j表示原矩阵的列
     44                 {
     45                     b[i][j] = getMultiSum(a, a, N, i, j);
     46                 }
     47 
     48             }
     49             break;
     50 
     51         case 3:
     52             int tmp[30][30];
     53             for (int i = 0; i < N; ++i)    //i表示原矩阵的行
     54             {
     55                 for (int j = 0; j < N; ++j)    //j表示原矩阵的列
     56                 {
     57                     tmp[i][j] = getMultiSum(a, a, N, i, j);
     58                 }
     59 
     60             }
     61             for (int i = 0; i < N; ++i)    //i表示原矩阵的行
     62             {
     63                 for (int j = 0; j < N; ++j)    //j表示原矩阵的列
     64                 {
     65                     b[i][j] = getMultiSum(a, tmp, N, i, j);
     66                 }
     67 
     68             }
     69             break;
     70 
     71         case 4:
     72             int tmp1[30][30];
     73             for (int i = 0; i < N; ++i)    //i表示原矩阵的行
     74             {
     75                 for (int j = 0; j < N; ++j)    //j表示原矩阵的列
     76                 {
     77                     tmp1[i][j] = getMultiSum(a, a, N, i, j);
     78                 }
     79 
     80             }
     81             int tmp2[30][30];
     82             for (int i = 0; i < N; ++i)    //i表示原矩阵的行
     83             {
     84                 for (int j = 0; j < N; ++j)    //j表示原矩阵的列
     85                 {
     86                     tmp2[i][j] = getMultiSum(a, tmp1, N, i, j);
     87                 }
     88 
     89             }
     90             for (int i = 0; i < N; ++i)    //i表示原矩阵的行
     91             {
     92                 for (int j = 0; j < N; ++j)    //j表示原矩阵的列
     93                 {
     94                     b[i][j] = getMultiSum(a, tmp2, N, i, j);
     95                 }
     96 
     97             }
     98 
     99             break;
    100 
    101         case 5:
    102             int tmp3[30][30];
    103             for (int i = 0; i < N; ++i)    //i表示原矩阵的行
    104             {
    105                 for (int j = 0; j < N; ++j)    //j表示原矩阵的列
    106                 {
    107                     tmp3[i][j] = getMultiSum(a, a, N, i, j);
    108                 }
    109 
    110             }
    111             int tmp4[30][30];
    112             for (int i = 0; i < N; ++i)    //i表示原矩阵的行
    113             {
    114                 for (int j = 0; j < N; ++j)    //j表示原矩阵的列
    115                 {
    116                     tmp4[i][j] = getMultiSum(a, tmp3, N, i, j);
    117                 }
    118 
    119             }
    120             int tmp5[30][30];
    121             for (int i = 0; i < N; ++i)    //i表示原矩阵的行
    122             {
    123                 for (int j = 0; j < N; ++j)    //j表示原矩阵的列
    124                 {
    125                     tmp5[i][j] = getMultiSum(a, tmp4, N, i, j);
    126                 }
    127 
    128             }
    129             for (int i = 0; i < N; ++i)    //i表示原矩阵的行
    130             {
    131                 for (int j = 0; j < N; ++j)    //j表示原矩阵的列
    132                 {
    133                     b[i][j] = getMultiSum(a, tmp5, N, i, j);
    134                 }
    135 
    136             }
    137 
    138 
    139             break;
    140 
    141         }
    142 
    143         for (int i = 0; i < N; ++i)
    144         {
    145             int j = 0;
    146             for (; j < N-1; ++j)
    147             {
    148                 cout << b[i][j] << ' ';
    149             }
    150             cout << b[i][j] << endl;
    151         }
    152     }
    153 
    154     return 0;
    155     
    156 }

    解法二: 使用vector代替二维数组

     1 #include <iostream>
     2 #include <vector>
     3 
     4 using namespace std;
     5 
     6 
     7 //矩阵a1与a2相乘,其中a1和a2都是N阶方阵,返回值为vector表示的二维数组
     8 vector<vector<int>> matrixMul(vector<vector<int>>a1, vector<vector<int>>a2, int N) 
     9 {
    10     vector<vector<int>> result(30);
    11     for (int i = 0; i < N; ++i)
    12         for (int j = 0; j < N; ++j)
    13             result[i].push_back(0);  //把结果矩阵置为0
    14 
    15 
    16     for (int i = 0; i < N; i++)    //矩阵乘法的三重循环
    17     {
    18         for (int j = 0; j < N; j++)
    19         {
    20             for (int k = 0; k < N; k++)
    21             {
    22                 result[i][j] += a1[i][k] * a2[k][j];
    23             }
    24 
    25         }
    26     }
    27 
    28     return result;
    29     
    30 }
    31 
    32 
    33 int main()
    34 {
    35     int N, M; //N表示矩阵的阶数,M表示幂
    36     while (cin >> N >> M)
    37     {
    38         vector<vector<int>>a(30);    //原矩阵
    39         vector<vector<int>>b(30);    //结果矩阵
    40         int e;
    41         for (int i = 0; i < N; ++i)
    42             for (int j = 0; j < N; ++j)
    43             {
    44                 cin >> e;
    45                 a[i].push_back(e);  //输入原矩阵
    46             }
    47 
    48         for (int i = 0; i < N; ++i)
    49             for (int j = 0; j < N; ++j)
    50                 b[i].push_back(0);  //把结果矩阵初始化为0
    51             
    52         if (M == 0)
    53         {
    54             for (int i = 0; i < N; ++i)
    55                 b[i][i] = 1;        //矩阵的零次方为单位矩阵
    56         }
    57         else 
    58         {
    59             b = a;        //矩阵的一次方
    60             if(M > 1)    //矩阵的M次方(M大于1)
    61                 for (int i = 0; i < M - 1; ++i)    
    62                 {
    63                     b = matrixMul(a, b, N);
    64                 }
    65         }
    66     
    67         
    68         for (int i = 0; i < N; ++i)        //输出结果
    69         {
    70             int j = 0;
    71             for (; j < N-1; ++j)
    72             {
    73                 cout << b[i][j] << ' ';
    74             }
    75             cout << b[i][j] << endl;
    76         }
    77     }
    78 
    79     return 0;
    80     
    81 }        
  • 相关阅读:
    五十七、linux 编程——UDP 编程 域名解析
    浅谈数学建模
    数值分析实验之线性方程组的迭代求解(MATLAB实现)
    数值分析实验之线性方程组的迭代求解(Python实现)
    数值分析实验之线性方程组的迭代求解(java实现)
    数值分析实验之最小二乘拟合 含有噪声扰动(MATLAB实现)
    数值分析实验之最小二乘拟合 含有噪声扰动(python实现)
    数值计算方法实验之newton多项式插值 (Python 代码)
    数值计算方法实验之Hermite 多项式插值 (Python 代码)
    数值计算方法实验之按照按三弯矩方程及追赶法的三次样条插值 (MATLAB 代码)
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/10355938.html
Copyright © 2011-2022 走看看