2278 - MMultiplication: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Cerinta == Se dau două matrice cu elemente numere întregi. Determinați produsul lor, dacă este posibil. == 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...
 
 
(3 intermediate revisions by the same user not shown)
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
;4 3
;mmultiplicationin.txt
;1 2 3
:4 3
;4 5 6
:1 2 3
;7 8 9
:4 5 6
;10 11 12
:7 8 9
;3 5
:10 11 12
;1 2 3 4 5
:3 5
;6 7 8 9 10
:1 2 3 4 5
;11 12 13 14 0
:6 7 8 9 10
:11 12 13 14 0


;Iesire
;Iesire
;Datele introduse corespund restrictiilor impuse
:Datele introduse corespund restrictiilor impuse
;46 52 58 64 25  
;mmultiplicationout.txt
;100 115 130 145 70  
:46 52 58 64 25  
;154 178 202 226 115  
:100 115 130 145 70  
;208 241 274 307 160
:154 178 202 226 115  
:208 241 274 307 160


== Exemplul 2 ==
== Exemplul 2 ==
;Intrare
;Intrare
;2 3
;mmultiplicationin.txt
;3600 0 -10
:2 3
;54 2479 1
:3600 0 -10
;3 2
:54 2479 1
;0 0
:3 2
;1 1
:0 0
;0 1
:1 1
:0 1


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




Line 55: 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 62: 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 75: 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 80: 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("mmultiplication.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 91: 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("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)


     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>