题目描述:
Alice在学线性代数。她觉得线代的计算特别麻烦,于是就来找你,希望你可以给她写一个程序计算两个矩阵的乘积。
矩阵乘法介绍: 矩阵A是一个N行P列的矩阵。 矩阵B是一个K行M列的矩阵。 当P=K时,A和B可以相乘(仅限于AB, BA不一定可行) 假设矩阵C=AB,那么C**i,j=∑t=1P(或K)A**i,t∗B**t,j
举个例子,假设A是一个2×3的矩阵,B是一个3×2的矩阵,最终结果C是一个2×2的矩阵,如下图所示
![](https://img-blog.csdnimg.cn/img_convert/8e1a70916ad5b18109eeeff9d3d04b7f.png)
输入格式:
输入共一行,有三个整数N,P,M(N,P,M≤100)。表示矩阵A是一个N×P的矩阵,矩阵B是一个P×M的矩阵。
接下来N行,每行P个整数,读入矩阵A。
再接下来P行,每行M个整数,读入矩阵B。
数据保证在输入输出数据可以用int类型存储。
输出格式:
输出N行M列的矩阵C。每行最后一个数后面有一个空格。
输入样例:
在这里给出一组输入。例如:
3 3 3
1 3 2
1 0 0
1 2 2
0 0 2
7 5 0
2 1 1
输出样例:
在这里给出相应的输出。例如:
25 17 4
0 0 2
18 12 4
解题思路:
采用IPO思路实现功能:
题目大意:对于A矩阵的一行,去乘以B矩阵的每一列,分别做和,得到C矩阵的一行元素
结果是A矩阵与C矩阵行数相同,B矩阵与C矩阵列数相同
创建A、B、C三个二维数组,和一个num数组用来存储A、B的乘积
(1)I:
输入N,P,M三个整数
(2)P:
解题的关键在于理解行标和列标的循环关系,所以在这里先说明几个关系:
A矩阵每变化一行,B矩阵变化一周;
即A矩阵的行标变化一次,B矩阵的列标变化一周;
而B矩阵的列标每变化一次,行标需要变化一周;
又因为B矩阵的行标即为A矩阵的列标,故A矩阵的列标也需要变化一周;
至此,循环关系明确:
第一层:A矩阵行标
第二层:B矩阵列标
第三层:B矩阵行标和A矩阵列标,二者其实是一个标记物
第三层每轮循环结束,将结果存入num数组
(3)O:
逻辑上输出C矩阵即可;
代码实现如下
#include <iostream>
using namespace std;
int A_matrix[100][100] = { 0 };//A矩阵
int B_matrix[100][100] = { 0 };//B矩阵
int num_array[100 * 100] = { 0 };//存储第三层每一轮运算结果
int main()
{
int N, P, M;
cin >> N >> P >> M;//表示矩阵A是一个N×P的矩阵,矩阵B是一个P×M的矩阵,矩阵C是一个N×M的矩阵
for (int i = 0; i < N; i++)//读入A矩阵
{
for (int j = 0; j < P; j++)
{
cin >> A_matrix[i][j];
}
}
for (int i = 0; i < P; i++)//读入B矩阵
{
for (int j = 0; j < M; j++)
{
cin >> B_matrix[i][j];
}
}
int index = 0;//num数组下标
for (int a = 0; a < N; a++)//a为A矩阵的行标
{
for (int b = 0; b < M; b++)//b为B矩阵的列标
{
for (int c = 0; c < P; c++)//c为B矩阵的行标、A矩阵的列标
{
num_array[index] += A_matrix[a][c] * B_matrix[c][b];
}
index++;
}
}
for (int i = 1; i <= N * M; i++)//输出C矩阵
{
cout << num_array[i - 1] << ' ';
if (i % M == 0)//每输出一行,换行
{
cout << endl;
}
}
return 0;
}