1700 - Produs Matrice Rara: Difference between revisions

From Bitnami MediaWiki
Line 37: Line 37:
[29, 2]
[29, 2]


Datele de intrare nu corespund restricțiilor impuse.
== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>

Revision as of 17:44, 2 June 2024

Cerința

Într-un tărâm digital, există o aplicație specializată în manipularea structurilor de date neomogene numită MatrixMaster. Această aplicație permite utilizatorilor să gestioneze și să opereze asupra matricelor rare (matrice care conțin majoritatea elementelor zero). O operație frecvent utilizată este calculul produsului scalar între o astfel de matrice rară și un vector dat. Sarcina ta este de a implementa această funcționalitate pentru MatrixMaster.

Date de intrare

Programul citește de la tastatură:

Dimensiunea n a matricei pătratice rare (n x n). m perechi de valori (i, j, val) reprezentând elementele nenule ale matricei, unde i este indicele de rând, j este indicele de coloană și val este valoarea elementului de la acea poziție. Un vector de dimensiune n.

Date de ieșire

Pe ecran se va afișa vectorul rezultat din produsul scalar între matricea rară și vectorul dat.

Restricții și precizări

  • 1 ⩽ n ⩽ 1000
  • 0 ⩽ m ⩽ n^2

Valorile i și j sunt indexate de la 0 la n-1 Valorile din matrice și vector sunt numere întregi în intervalul [-1000, 1000]

Exemplu 1

Intrare

3
2
0 1 5
2 0 3
[1, 2, 3]

Iesire

[10, 0, 3]

Exemplu 2

Intrare

2
3
0 0 4
0 1 7
1 0 1
[2, 3]

Iesire

[29, 2]

Rezolvare

<syntaxhighlight lang="python" line> def citeste_date():

   n = int(input("Introduceți dimensiunea matricii pătratice rare (n): "))
   m = int(input("Introduceți numărul de elemente nenule (m): "))
   
   elemente_nenule = []
   for _ in range(m):
       i, j, val = map(int, input("Introduceți (i, j, val): ").split())
       elemente_nenule.append((i, j, val))
   
   vector = list(map(int, input("Introduceți vectorul (valori separate prin spațiu): ").split()))
   
   return n, elemente_nenule, vector

def valideaza_date(n, elemente_nenule, vector):

   if not (1 <= n <= 1000):
       return False
   if not (0 <= len(elemente_nenule) <= n * n):
       return False
   if len(vector) != n:
       return False
   for i, j, val in elemente_nenule:
       if not (0 <= i < n and 0 <= j < n and -1000 <= val <= 1000):
           return False
   if not all(-1000 <= val <= 1000 for val in vector):
       return False
   return True

def produs_scalar_matrice_vector(n, elemente_nenule, vector):

   rezultat = [0] * n
   for i, j, val in elemente_nenule:
       rezultat[i] += val * vector[j]
   return rezultat

def main():

   n, elemente_nenule, vector = citeste_date()
   
   if not valideaza_date(n, elemente_nenule, vector):
       print("Datele de intrare nu corespund restricțiilor impuse.")
       return
   
   print("Datele de intrare corespund restricțiilor impuse.")
   rezultat = produs_scalar_matrice_vector(n, elemente_nenule, vector)
   print(rezultat)

if __name__ == "__main__":

   main()

</syntaxhighlight>