2278 - MMultiplication: Difference between revisions
No edit summary |
|||
(2 intermediate revisions by the same user not shown) | |||
Line 5: | Line 5: | ||
== Date de intrare == | == Date de intrare == | ||
Fișierul 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 == | == Date de iesire == | ||
Fișierul de ieșire | 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 | *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 | |||
;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 | |||
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(" | 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(" | with open("mmultiplicationin.txt", "r") as f: | ||
matrice_A, | n_A, m_A = map(int, f.readline().split()) | ||
matrice_B, | 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 | # Scrierea rezultatului în fisierul de ieșire | ||
with open(" | 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 | # Nu se poate efectua înmulțirea | ||
with open(" | 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>