7-1 稀疏矩阵加法 PTA

给定两个矩阵A和B,求其和矩阵C=A+B。

输入格式:

第一行包含两个数Row和Col,分别表示矩阵的行数和列数,A和B的维度是一致的。

第二行只有一个数N1​,表示接下来要输入的A中的非零元素的个数。

接下来是N1​行,每一行都是i j A[i,j] 这样的形式,表示的A中第i行第j列的元素A[i,j],为了与大多数编程语言保持一致,它们都是从零开始的,也就是说下标的有效范围是[0,Row−1]×[0,Col−1]。

在N1​行之后,是一个数N2​,表示矩阵B中非零元素的数量,此后N2​行描述B中的非零元素,它们与此前描述A中非零元素的形式一致。

矩阵元素的输入均遵循行主序。这里的所有的输入均可用int类型正确表示,可以假设输入均是合法的。

输出格式:

第一行输出和矩阵C=A+B中的绝对值大于0.1的元素个数N3​,此后是N3​行,按照行主序输出其中的非零元素,依次是行、列的下标和对应的元素。

输入样例:

2 2
1
1 1 1
1
0 0 1

 输出样例:

2
0 0 1
1 1 1

代码段: 

#include <iostream>
using namespace std;
#define MAX 100

typedef struct node{
	int row,col;
	int value;
}Node;

int main()
{
	int Row,Col;
	int An1,Bn1;
	
	int i,N;
	
	Node Matrix_A[MAX];
	Node Matrix_B[MAX];
	Node Matrix_C[MAX];
	
	int index_A=0,index_B=0,index_C=0;
	int value;
	
	cin>>Row>>Col;   //输入部分
	N = Row*Col;
	cin>>An1;
	for(i=0;i<An1;i++)
	{
		cin>>Matrix_A[i].row>>Matrix_A[i].col>>Matrix_A[i].value;
	}
	cin>>Bn1;
	for(i=0;i<Bn1;i++)
	{
		cin>>Matrix_B[i].row>>Matrix_B[i].col>>Matrix_B[i].value;
	}
	
	while(index_A<An1 && index_B<Bn1)  //核心代码部分
	{
		if(Matrix_A[index_A].row<Matrix_B[index_B].row)
		{
			Matrix_C[index_C]=Matrix_A[index_A];
			index_C++;
			index_A++;
		}else if(Matrix_A[index_A].row>Matrix_B[index_B].row)
		{
			Matrix_C[index_C]=Matrix_B[index_B];
			index_C++;
			index_B++;
		}else{
			if(Matrix_A[index_A].col<Matrix_B[index_B].col)
			{
				Matrix_C[index_C]=Matrix_A[index_A];
				index_C++;
				index_A++;
			}else if(Matrix_A[index_A].col>Matrix_B[index_B].col)
			{
				Matrix_C[index_C]=Matrix_B[index_B];
				index_C++;
				index_B++;
			}else
			{
				value = Matrix_A[index_A].value+Matrix_B[index_B].value;
				if(value==0)
				{
					index_A++;
					index_B++;
					continue;
				}
				Matrix_C[index_C].row = Matrix_A[index_A].row;
                Matrix_C[index_C].col = Matrix_A[index_A].col;
                Matrix_C[index_C].value = value;
                index_A++;
                index_B++;
                index_C++;	
			}
			
		}	
	} //while 
	
	if(index_A<An1)
    {
        for(int i = index_A;i<An1;i++)
        {
            Matrix_C[index_C] = Matrix_A[i];
            index_C++;
        }
    }
    
    if(index_B<Bn1)
    {
        for(int i = index_B;i<Bn1;i++)
        {
            Matrix_C[index_C] = Matrix_B[i];
            index_C++;
        }
	}
	
	cout<<index_C<<endl;   //输出部分
	for(i=0;i<index_C;i++)
	{
		cout<<Matrix_C[i].row<<" "<<Matrix_C[i].col<<" "<<Matrix_C[i].value<<endl;
	}
	
	
	
	return 0;
}

总结:

        代码实现方法比较笨,核心代码部分是对各种情况的一一列举(例如,A的行数小于B,大于B,等于B的情况。在等于B的情况下,再判断A、B的列的情况。)

        带所有判断结束后,在将A、B种没有尽数赋值到C的一一赋值。总结来说代码较笨,却也较容易理解。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 稀疏矩阵加法是指对两个稀疏矩阵进行加法运算。其中,稀疏矩阵是指矩阵中大部分元素为的矩阵。 三元组顺序表是一种常用的稀疏矩阵存储方式。在三元组顺序表中,每个非零元素都用一个三元组表示,包括该元素所在的行、列和元素值。 对于两个稀疏矩阵A和B,它们的三元组顺序表分别为tripletA和tripletB。稀疏矩阵加法的过程如下: 1. 首先,将tripletA和tripletB中的行、列信息进行比较,找出它们的交集,即两个矩阵中都存在的非零元素。 2. 对于交集中的每个元素,将它们的值相加,得到新的元素值。 3. 将新的元素值和行、列信息组成一个新的三元组,存储到结果矩阵的三元组顺序表中。 4. 对于只存在于A或B中的非零元素,直接将它们添加到结果矩阵的三元组顺序表中。 5. 最后,将结果矩阵的三元组顺序表按行、列顺序排序,得到最终的结果矩阵。 以上就是三元组顺序表表示的稀疏矩阵加法的过程。 ### 回答2: 稀疏矩阵加法指的是将两个稀疏矩阵进行相加的过程。在计算机的科学领域中,稀疏矩阵通常用三元组顺序表来表示。三元组顺序表是一种将非零元素按行优先次序存储的方式,通常包括三个属性:行、列和数值。行和列分别表示非零元素在矩阵中的位置,数值则表示该元素的值。 稀疏矩阵加法与普通矩阵加法不同,因为稀疏矩阵中大部分元素都是零,只有极少数为非零。因此在进行稀疏矩阵加法时,我们只需对每个非零元素进行加和,并将结果存储在新的三元组顺序表中即可。 具体的算法步骤如下: 1. 定义两个稀疏矩阵 A 和 B,分别用三元组顺序表表示; 2. 定义一个新的三元组顺序表 C,用于存储 A 和 B 的和; 3. 分别遍历 A 和 B,将它们的对应位置上的非零元素相加,并将结果存储在 C 中; 4. 将 C 输出即可。 需要注意的是,在对 A 和 B 的非零元素进行相加时,首先需要检查它们的行和列是否相同,只有相同的元素才能进行相加。同时,如果某个矩阵中存在没有对应的元素,也需要特殊处理。 总之,稀疏矩阵加法是一种简单但有效的方法,可以大幅度减少存储空间和计算复杂度,特别适用于处理大型稀疏矩阵。 ### 回答3: 在稀疏矩阵加法中,我们可以使用三元组顺序表的方式表示稀疏矩阵。三元组顺序表是由三个一维数组构成,分别存储非零元素的行、列和数值。其中,行和列都按照行优先的顺序存储,即从左到右、从上到下。 在进行稀疏矩阵加法时,我们需要先将两个矩阵转换为三元组顺序表的形式,并按照行列坐标的大小顺序进行合并。具体操作如下: 1. 遍历两个矩阵的三元组顺序表,以行列坐标的大小顺序合并。 2. 如果两个三元组的行列坐标相同,则将它们的数值相加作为合并后的三元组的数值。 3. 如果两个三元组的行列坐标不同,则将行列坐标较小的三元组先存储。然后,向行列坐标较大的三元组方向移动,直到行列坐标相同,此时将数值相加,作为合并后的三元组的数值。 4. 合并后的三元组即为稀疏矩阵加法的结果矩阵的三元组顺序表。 需要注意的是,合并后的结果三元组顺序表中可能存在相同的行列坐标的三元组,这时我们需要将它们的数值相加。另外,为了方便表示,合并后的结果矩阵应当去除值为零的元素,即只保留非零元素。 总之,三元组顺序表表示的稀疏矩阵加法需要先转换为三元组顺序表形式,然后按照行列坐标的大小顺序进行合并,并对合并后的结果进行去零处理,得到最终的结果三元组顺序表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亮子i_12138

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值