# PBinfo #1700 – produsMatriceRara – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

Cerința
O matrice A(n,m) se numeşte rară dacă majoritatea elementelor sale sunt nule. O matrice rară poate fi memorată sub forma unei înregistrări ce conţine numărul de linii, coloane, elemente nenule şi un şir de triplete de forma (linie, coloană, valoare).

Considerând cele două structuri de mai jos

// inregistrare reprezentand un triplet <linie, coloana, valoare>
struct triplet {
    int linie, coloana, valoare;
};
// inregistrare reprezentand matricea rara 
struct matrice_rara {
    int nr_linii, nr_coloane, nr_triplete;
    triplet t[1005];
};
scrieţi în limbajul C++ definiţia completă a subprogramului inmultire cu următorul antet:

void inmultire(matrice_rara a, matrice_rara b, matrice_rara &c)
ce calculează în c produsul matricelor rare a şi b.

Restricții și precizări

a.nr_coloane = b.nr_linii
liniile şi coloanele celor două matrici a şi b sunt indexate de la 0
tripletele sunt indexate de la 0, în ordine lexicografică după (linie, coloană)

Exemplu:
Intrare


a.nr_linii = 3; a.nr_coloane = 4; a.nr_triplete = 4;
a.t = {{0, 0, 2},
       {0, 3, 5},
       {1, 0, 4},
       {2, 2, 1}};
b.nr_linii = 4; b.nr_coloane = 4; b.nr_triplete = 6;
b.t = {{0, 0, 4},
       {1, 2, 8},
       {1, 3, 9},
       {2, 1, 6},
       {3, 0, 5},
       {3, 3, 1}};
Ieșire

c.nr_linii = 3; c.nr_coloane = 4; c.nr_triplete = 4;
c.t = {{0, 0, 33},
       {0, 3, 5},
       {1, 0, 16},
       {2, 1, 6}};
Explicație
\(\scriptsize A=\begin{bmatrix}
2 & 0 & 0 & 5\\ 
4 & 0 & 0 & 0\\ 
0 & 0 & 1 & 0
\end{bmatrix}; B=\begin{bmatrix}
4 & 0 & 0 & 0\\ 
0 & 0 & 8 & 9\\ 
0 & 6 & 0 & 0\\
5 & 0 & 0 & 1
\end{bmatrix}; C = A \cdot B =\begin{bmatrix}
33 & 0 & 0 & 5\\ 
16 & 0 & 0 & 0\\ 
0 & 6 & 0 & 0
\end{bmatrix}\)

## Cod sursă C++

```cpp
//---------------------------------------------------------------------------------------------------------------
// c = a * b
void inmultire(matrice_rara a, matrice_rara b, matrice_rara &c) {
    // se presupune ca numarul de coloane din matricea a este egal cu numarul de linii din matricea b
    c.nr_linii      = a.nr_linii;
    c.nr_coloane    = b.nr_coloane;
    c.nr_triplete   = 0;
    // calculul inmulturii
    for(int i = 0; i < a.nr_linii; i++)
        for(int j = 0; j < b.nr_coloane; j++) {
            int suma = 0;
            // calcul valoare element
            for(int col = 0; col < a.nr_coloane; col++)
                for(int i1 = 0; i1 < a.nr_triplete; i1++)
                    // verificam daca exista in a si b
                    if(a.t[i1].linie == i && a.t[i1].coloana == col)
                        for(int i2 = 0; i2 < b.nr_triplete; i2++)
                            if(b.t[i2].linie == col && b.t[i2].coloana == j)
                                suma += a.t[i1].valoare * b.t[i2].valoare;
            if(suma != 0)
                c.t[c.nr_triplete++] = {i, j, suma};
        }
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/1700)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/1700/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-1700/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
