14. 稀疏矩阵的乘法运算

这个题上课有讲,但是没有完全讲

先按三元组的顺序把前两个矩阵存好,由于第三个矩阵会出现几行几列不知道,所以所有的位数都要初始化

但是矩阵是二维,实际存是一维数组,所以存的次序要好好考虑。而且题目给的数组是从1开始的

最妙的一步是讲三元组做乘法,考虑到矩阵乘法,肯定是两个for,一个A数组遍历所有B数组,关键是A数组的值不一定能和B数组的值在做乘法的时候碰到,而条件就是A的列要等于B的行

此题,先要定义一个结构,有行列,数值,再定义一个整体,有上面结构的data数组,再包括行数,列数,个数初始为0

录入两个数组,再初始化第三个数组

第三个数组是行列全包含,初值为0,之后输出的时候非零元输出

计算过程,遍历两个三元组,假如碰到A的列等于B的行,就计算,判断结构是否为0,不为0则加到相应位置上,新的结果如果等于此结果,说明是第一次加,则个数++,若新结果为0,则个数—

然后我写完,挂掉了,Debug了好久

#include<bits/stdc++.h>

using namespace std;

#define Max 10005

/*

100

1

2

1 1 1

2 1 1

1

100

2

1 1 1

1 100 1

*/

typedef struct {

       int hang,lie,zhi;

}elem;

typedef struct{

       elem data[Max];

       int Hang,Lie,Shu=0;

}juzheng;

int main(void){

       juzheng A,B,C;

       scanf("%d\n%d\n%d",&A.Hang,&A.Lie,&A.Shu);

       for(int i=0;i<A.Shu;i++){

              scanf("%d %d %d",&A.data[i].hang,&A.data[i].lie,&A.data[i].zhi);

              A.data[i].hang--;

              A.data[i].lie--;

       }

       scanf("%d\n%d\n%d",&B.Hang,&B.Lie,&B.Shu);

       for(int i=0;i<B.Shu;i++){

              scanf("%d %d %d",&B.data[i].hang,&B.data[i].lie,&B.data[i].zhi);

              B.data[i].hang--;

              B.data[i].lie--;

       }

       C.Hang=A.Hang;

       C.Lie=B.Lie;

       for(int i=0;i<C.Hang;i++){

              for(int j=0;j<C.Lie;j++){

                     C.data[i*C.Lie+j].zhi=0;

                     C.data[i*C.Lie+j].hang=i;

                     C.data[i*C.Lie+j].lie=j;

              }

       }

       for(int i=0;i<A.Shu;i++){

              for(int j=0;j<B.Shu;j++){

                     int ans=0;

                     if(A.data[i].lie==B.data[j].hang){

                            ans=A.data[i].zhi*B.data[j].zhi;

                     }

                     if(ans!=0){

                            C.data[A.data[i].hang*C.Lie+B.data[j].lie].zhi+=ans;

                            if(C.data[A.data[i].hang*C.Lie+B.data[j].lie].zhi==0){// 第一次加

                                   C.Shu--;

                                   //printf("%d %d\n",C.data[A.data[i].hang*A.Hang+B.data[j].lie].hang,C.data[A.data[i].hang*A.Hang+B.data[j].lie].lie);

                            }

                            else if(C.data[A.data[i].hang*C.Lie+B.data[j].lie].zhi==ans){//后面制0

                                   C.Shu++;

                            }

                     }

              }

       }

       printf("%d\n%d\n%d\n",C.Hang,C.Lie,C.Shu);

       for(int i=0;i<C.Hang*C.Lie;i++){

              if(C.data[i].zhi!=0){

                     printf("%d,%d,%d\n",C.data[i].hang+1,C.data[i].lie+1,C.data[i].zhi);

              }

       }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值