2278 - MMultiplication: Difference between revisions

From Bitnami MediaWiki
No edit summary
 
(One intermediate revision by the same user not shown)
Line 58: Line 58:
     n, m = map(int, fisier.readline().split())
     n, m = map(int, fisier.readline().split())
     matrice = []
     matrice = []
   
 
     # Citeste elementele matricei
     # Citeste elementele matricei
     for _ in range(n):
     for _ in range(n):
Line 65: Line 65:


     return matrice, n, m
     return matrice, n, m
def este_input_valid(n_A, m_A, n_B, m_B):
    return 1 <= n_A <= 1000 and 1 <= m_A <= 1000 and 1 <= n_B <= 1000 and 1 <= m_B <= 1000 and m_A == n_B


def inmulteste_matrici(matrice_A, n_A, m_A, matrice_B, n_B, m_B):
def inmulteste_matrici(matrice_A, n_A, m_A, matrice_B, n_B, m_B):
     if m_A != n_B:
     if m_A != n_B:
         raise ValueError("Numarul de coloane al primei matrici nu coincide cu numarul de linii al celei de-a doua matrici")
         raise ValueError("Numărul de coloane al primei matrici nu coincide cu numărul de linii al celei de-a doua matrici")


     matrice_produs = [[0] * m_B for _ in range(n_A)]
     matrice_produs = [[0] * m_B for _ in range(n_A)]
Line 78: Line 83:


     return matrice_produs, n_A, m_B
     return matrice_produs, n_A, m_B


def scrie_matrice(fisier, matrice, n, m):
def scrie_matrice(fisier, matrice, n, m):
Line 83: Line 89:
     for linie in matrice:
     for linie in matrice:
         fisier.write(" ".join(map(str, linie)) + "\n")
         fisier.write(" ".join(map(str, linie)) + "\n")


def main():
def main():
     # Citirea datelor de intrare din fisier
     # Citirea datelor de intrare din fisier
     with open("mmultiplicationin.txt", "r") as f:
     with open("mmultiplicationin.txt", "r") as f:
         matrice_A, n_A, m_A = citeste_matrice(f)
        n_A, m_A = map(int, f.readline().split())
         matrice_B, n_B, m_B = citeste_matrice(f)
         matrice_A, _, _ = citeste_matrice(f)
        n_B, m_B = map(int, f.readline().split())
         matrice_B, _, _ = citeste_matrice(f)
 
    # Verificare validitate date de intrare
    if not este_input_valid(n_A, m_A, n_B, m_B):
        print("Datele introduse nu corespund restrictiilor impuse.")
        return


     # Calcularea produsului matricelor
     # Calcularea produsului matricelor
Line 94: Line 108:
         matrice_produs, n_produs, m_produs = inmulteste_matrici(matrice_A, n_A, m_A, matrice_B, n_B, m_B)
         matrice_produs, n_produs, m_produs = inmulteste_matrici(matrice_A, n_A, m_A, matrice_B, n_B, m_B)


         # Scrierea rezultatului in fisierul de iesire
         # Scrierea rezultatului în fisierul de ieșire
         with open("mmultiplicationout.txt", "w") as g:
         with open("mmultiplicationout.txt", "w") as g:
             scrie_matrice(g, matrice_produs, n_produs, m_produs)
             scrie_matrice(g, matrice_produs, n_produs, m_produs)


     except ValueError as e:
     except ValueError as e:
         # Nu se poate efectua inmultirea
         # Nu se poate efectua înmulțirea
         with open("mmultiplication.txt", "w") as g:
         with open("mmultiplicationout.txt", "w") as g:
             g.write("-1")
             g.write("-1")


if __name__ == "__main__":
if __name__ == "__main__":
     main()
     main()
</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 11:30, 29 December 2023

Cerinta[edit | edit source]

Se dau două matrice cu elemente numere întregi. Determinați produsul lor, dacă este posibil.

Date de intrare[edit | edit source]

Fișierul de intrare mmultiplicationin.txt conține pe prima linie numerele n și m reprezentând numărul de linii, respectiv de coloane, al matricii A. Pe următoarele n linii sunt câte m numere întregi separate printr-un spațiu, reprezentând elementele matricii A. Pe linia n+2 a fișierului se află două numere p și q reprezentând numărul de linii, respectiv de coloane, al matricii B. Pe următoarele p linii sunt câte q numere întregi separate printr-un spațiu, reprezentând elementele matricii B.

Date de iesire[edit | edit source]

Fișierul de ieșire mmultiplicationout.txt va conține pe prima linie numărul -1, în cazul în care matricele nu pot fi înmulțite. Dacă matricele pot fi înmulțite, se va afișa matricea rezultată după înmulțirea celor două, câte o linie a matricei pe o linie din fișier, elementele fiecărei linii fiind separate prin câte un spațiu.

Restrictii si precizari[edit | edit source]

  • 1 &;les; n, m, p, q ⩽ 1000
  • elementele matricelor vor fi numere întregi cu valoarea absolută mai mică decât 2000

Exemplul 1[edit | edit source]

Intrare
mmultiplicationin.txt
4 3
1 2 3
4 5 6
7 8 9
10 11 12
3 5
1 2 3 4 5
6 7 8 9 10
11 12 13 14 0
Iesire
Datele introduse corespund restrictiilor impuse
mmultiplicationout.txt
46 52 58 64 25
100 115 130 145 70
154 178 202 226 115
208 241 274 307 160

Exemplul 2[edit | edit source]

Intrare
mmultiplicationin.txt
2 3
3600 0 -10
54 2479 1
3 2
0 0
1 1
0 1
Iesire
Datele introduse nu corespund restrictiilor impuse


Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def citeste_matrice(fisier):

   # Citeste dimensiunile matricei
   n, m = map(int, fisier.readline().split())
   matrice = []
   # Citeste elementele matricei
   for _ in range(n):
       linie = list(map(int, fisier.readline().split()))
       matrice.append(linie)
   return matrice, n, m


def este_input_valid(n_A, m_A, n_B, m_B):

   return 1 <= n_A <= 1000 and 1 <= m_A <= 1000 and 1 <= n_B <= 1000 and 1 <= m_B <= 1000 and m_A == n_B


def inmulteste_matrici(matrice_A, n_A, m_A, matrice_B, n_B, m_B):

   if m_A != n_B:
       raise ValueError("Numărul de coloane al primei matrici nu coincide cu numărul de linii al celei de-a doua matrici")
   matrice_produs = [[0] * m_B for _ in range(n_A)]
   for i in range(n_A):
       for j in range(m_B):
           for k in range(m_A):
               matrice_produs[i][j] += matrice_A[i][k] * matrice_B[k][j]
   return matrice_produs, n_A, m_B


def scrie_matrice(fisier, matrice, n, m):

   fisier.write(f"{n} {m}\n")
   for linie in matrice:
       fisier.write(" ".join(map(str, linie)) + "\n")


def main():

   # Citirea datelor de intrare din fisier
   with open("mmultiplicationin.txt", "r") as f:
       n_A, m_A = map(int, f.readline().split())
       matrice_A, _, _ = citeste_matrice(f)
       n_B, m_B = map(int, f.readline().split())
       matrice_B, _, _ = citeste_matrice(f)
   # Verificare validitate date de intrare
   if not este_input_valid(n_A, m_A, n_B, m_B):
       print("Datele introduse nu corespund restrictiilor impuse.")
       return
   # Calcularea produsului matricelor
   try:
       matrice_produs, n_produs, m_produs = inmulteste_matrici(matrice_A, n_A, m_A, matrice_B, n_B, m_B)
       # Scrierea rezultatului în fisierul de ieșire
       with open("mmultiplicationout.txt", "w") as g:
           scrie_matrice(g, matrice_produs, n_produs, m_produs)
   except ValueError as e:
       # Nu se poate efectua înmulțirea
       with open("mmultiplicationout.txt", "w") as g:
           g.write("-1")


if __name__ == "__main__":

   main()

</syntaxhighlight>