2278 - MMultiplication: Difference between revisions
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(" | 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 = 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 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 | # 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 | # 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>