您的位置:首页 > 编程语言 > C语言/C++

PTA L1-048 矩阵A乘以B C++实现

2020-03-06 16:31 936 查看

矩阵A乘以B

给定两个矩阵AAA和BBB,要求你计算它们的乘积矩阵ABABAB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若AAA有RaR_aR​a​​行、CaC_aC​a​​列,BBB有RbR_bR​b​​行、CbC_bC​b​​列,则只有CaC_aC​a​​与RbR_bR​b​​相等时,两个矩阵才能相乘。输入格式:输入先后给出两个矩阵AAA和BBB。对于每个矩阵,首先在一行中给出其行数RRR和列数CCC,随后RRR行,每行给出CCC个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的RRR和CCC都是正数,并且所有整数的绝对值不超过100。输出格式:若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵ABABAB,否则输出Error: Ca != Rb,其中Ca是AAA的列数,Rb是BBB的行数。
输入样例1:

2 3
1 2 3
4 5 6
3 4
7 8 9 0
-1 -2 -3 -4
5 6 7 8

输出样例1:

2 4
20 22 24 16
53 58 63 28

输入样例2:

3 2
38 26
43 -5
0 17
3 2
-11 57
99 68
81 72

输出样例2:

Error: 2 != 3

Talk is cheap. Show me the code.

#include<iostream>

using namespace std;
int main()
{
int row_a=0,col_a=0;
cin>>row_a>>col_a;
int arr_a[row_a*col_a]={0};
for(int i=0;i<row_a*col_a;i++)
{
cin>>arr_a[i];
}
int row_b=0,col_b=0;
cin>>row_b>>col_b;
int arr_b[row_b*col_b]={0};
for(int i=0;i<row_b*col_b;i++)
{
cin>>arr_b[i];
}
if(col_a!=row_b)
{
cout<<"Error: "<<col_a<<" != "<<row_b;
return 0;
}
else
{
cout<<row_a<<" "<<col_b<<endl;
}
for(int i=0;i<row_a;i++)
{
for(int j=0;j<col_b;j++)
{
int sum=0;
for(int k=0;k<col_a;k++)
{
sum=sum+arr_a[k+i*col_a]*arr_b[j+k*col_b];
}
cout<<sum;
if(j<col_b-1)
{
cout<<" ";
}
}
cout<<endl;
}
}

解题思路

这个题主要就是如何寻找矩阵的坐标,因为矩阵相乘是用一行乘以另一个矩阵的一列,然后求和输出。

分步代码解释

1.

for(int i=0;i<row_a;i++)
{
for(int j=0;j<col_b;j++)
{
int sum=0;
for(int k=0;k<col_a;k++)
{
sum=sum+arr_a[k+i*col_a]*arr_b[j+k*col_b];
}
cout<<sum;
if(j<col_b-1)
{
cout<<" ";
}
}
cout<<endl;
}

外层循环是根据相乘后矩阵的行数输出,中层循环是根据相乘后矩阵的列数输出,内层循环是计算相乘后矩阵每一个数并输出。我只用了两个一维数组来存储矩阵,根据规律可以找到矩阵A每一行的坐标公式为k+icol_a,k指每一行的第几个数,icol_a指第几行;矩阵B每一列的坐标公式为j+kcol_b,j指第几列,kcol_b根据j得到这一列的数。sum求和输出即可。

易错点

1.

输出相乘后的矩阵时每一行最后不能有空格否则会出现格式错误。

测试结果

  • 点赞
  • 收藏
  • 分享
  • 文章举报
闭关ing 发布了48 篇原创文章 · 获赞 1 · 访问量 715 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: