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

矩阵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.

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

测试结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值