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 }        

原文地址:https://www.cnblogs.com/FengZeng666/p/10355938.html

时间: 2024-08-28 04:19:43

1571:基础练习 矩阵乘法的相关文章

蓝桥杯基础练习---矩阵乘法

基础练习 矩阵乘法 时间限制:1.0s   内存限制:512.0MB 锦囊1 锦囊2 锦囊3 问题描述 给定一个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次幂所对应的矩阵.相邻的数之间用一个空格隔开 样例

蓝桥网试题 java 基础练习 矩阵乘法

------------------------------------------------------------ 第一次感觉到好好学习的重要性QAQ 在做这道题之前请先学会 :矩阵乘法(百度百科) 矩阵的0次幂:对角线为1 其他值为0 例如 结果 ------------------------------------------------------------ 算法 1 import java.util.*; 2 public class Main { 3 public stati

蓝桥基础练习 矩阵乘法 BASIC-17(矩阵快速幂)

问题描述 给定一个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 21 23 4 样例输出 7 1015 22 解:矩阵乘法满足结合律,所以也可以用快

基础练习 矩阵乘法 时间限制:1.0s 内存限制:512.0MB

时间限制:1.0s   内存限制:512.0MB 问题描述 给定一个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

基础练习 矩阵乘法

时间限制:1.0s   内存限制:512.0MB 问题描述 给定一个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 21 23 4 样例输出 7 10

【试题 基础练习 矩阵乘法】暴力矩阵乘法,再次了解一下矩阵

问题描述 给定一个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 21 23 4 样例输出 7 1015 22 import java.io.Buff

CODEVS1287 矩阵乘法

基础的矩阵乘法. Program CODEVS1287; const maxn=208; var k1,k2,k3,sum:int64; a,b,c:array[0..maxn,0..maxn] of int64; i,j,k:longint; begin readln(k1,k2); for i:=1 to k1 do for j:=1 to k2 do read(a[i,j]); readln(k2,k3); for i:=1 to k2 do for j:=1 to k3 do read(

[BASIC-17] 矩阵乘法

基础练习 矩阵乘法 时间限制:1.0s   内存限制:512.0MB 问题描述 给定一个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

【日常学习】codevs1287 矩阵乘法题解

转载请注明出处 [ametake版权所有]http://blog.csdn.net/ametake欢迎来看. 先上题目 题目描述 Description 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容. 当然,小明上课打瞌睡也没问题,但线性代数的习题可是很可怕的.小明希望你来帮他完成这个任务. 现在给你一个ai行aj列的矩阵和一个bi行bj列的矩阵,要你求出他们相乘的积(当然也是矩阵). (输入数据保证aj=bi,不需要判断) 矩阵乘法的定义: