2278 - MMultiplication: Difference between revisions

From Bitnami MediaWiki
No edit summary
No edit summary
Line 5: Line 5:
== Date de intrare ==
== Date de intrare ==


Fișierul de intrare mmultiplication.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.
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 ==
== Date de iesire ==


Fișierul de ieșire mmultiplication.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.
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 ==
== Restrictii si precizari ==


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


== Exemplul 1 ==
== Exemplul 1 ==
;Intrare
;Intrare
;mmultiplicationin.txt
:4 3
:4 3
:1 2 3
:1 2 3
Line 29: Line 30:


;Iesire
;Iesire
;Datele introduse corespund restrictiilor impuse
:Datele introduse corespund restrictiilor impuse
;mmultiplicationout.txt
:46 52 58 64 25  
:46 52 58 64 25  
:100 115 130 145 70  
:100 115 130 145 70  
Line 37: Line 39:
== Exemplul 2 ==
== Exemplul 2 ==
;Intrare
;Intrare
;mmultiplicationin.txt
:2 3
:2 3
:3600 0 -10
:3600 0 -10
Line 46: Line 49:


;Iesire
;Iesire
;Datele introduse nu corespund restrictiilor impuse
:Datele introduse nu corespund restrictiilor impuse




Line 83: Line 86:
def main():
def main():
     # Citirea datelor de intrare din fisier
     # Citirea datelor de intrare din fisier
     with open("mmultiplication.txt", "r") as f:
     with open("mmultiplicationin.txt", "r") as f:
         matrice_A, n_A, m_A = citeste_matrice(f)
         matrice_A, n_A, m_A = citeste_matrice(f)
         matrice_B, n_B, m_B = citeste_matrice(f)
         matrice_B, n_B, m_B = citeste_matrice(f)
Line 92: Line 95:


         # Scrierea rezultatului in fisierul de iesire
         # Scrierea rezultatului in fisierul de iesire
         with open("mmultiplication.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)



Revision as of 08:49, 27 December 2023

Cerinta

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

Date de intrare

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

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

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

Exemplul 1

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

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

<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 inmulteste_matrici(matrice_A, n_A, m_A, matrice_B, n_B, m_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")
   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:
       matrice_A, n_A, m_A = citeste_matrice(f)
       matrice_B, n_B, m_B = citeste_matrice(f)
   # 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 in fisierul de iesire
       with open("mmultiplicationout.txt", "w") as g:
           scrie_matrice(g, matrice_produs, n_produs, m_produs)
   except ValueError as e:
       # Nu se poate efectua inmultirea
       with open("mmultiplication.txt", "w") as g:
           g.write("-1")

if __name__ == "__main__":

   main()

</syntaxhighlight>