1398 - Determinant

De la Universitas MediaWiki

Cerința

Se dă o matrice pătratică de dimensiune n. Să se calculeze determinantul ei.

Date de intrare

Fișierul de intrare determinantIN.txt conține pe prima linie numărul n, iar pe următoarele n linii câte n numere întregi, reprezentând elementele matricei.

Date de ieșire

Fișierul de ieșire determinantOUT.txt va conține pe prima linie numărul D, reprezentând valoarea determinantului.

Restricții și precizări

  • 1 ≤ n ≤ 10

Exemplul 1

determinantIN.txt

3
1 -2 3
0 1 -1
2 1 -3

determinantOUT.txt

-4

Exemplul 2

determinantIN.txt

20
1 -2 3
0 1 -1
2 1 -3

determinantOUT.txt

Datele de intrare nu respectas restrictiile impuse.

Rezolvare

def are_restricții_valide(n, matrice):
    if not (1 <= n <= 10):
        return False
    
    for linie in matrice:
        if len(linie) != n:
            return False
    
    return True

def calcul_cofactor(matrice, linie, coloana):
    submatrice = [row[:coloana] + row[coloana + 1:] for row in (matrice[:linie] + matrice[linie + 1:])]
    semn = (-1) ** (linie + coloana)
    return semn * calcul_determinant(submatrice)

def calcul_determinant(matrice):
    n = len(matrice)
    if n == 1:
        return matrice[0][0]
    elif n == 2:
        return matrice[0][0] * matrice[1][1] - matrice[0][1] * matrice[1][0]
    else:
        determinant = 0
        for coloana in range(n):
            determinant += matrice[0][coloana] * calcul_cofactor(matrice, 0, coloana)
        return determinant

# Citirea datelor de intrare
try:
    with open("determinantIN.txt", "r") as file_in:
        n = int(file_in.readline().strip())
        matrice = [list(map(int, file_in.readline().split())) for _ in range(n)]
except FileNotFoundError:
    with open("determinantOUT.txt", "w") as file_out:
        file_out.write("Fișierul determinantIN.txt nu a fost găsit.")
    exit()
except Exception as e:
    with open("determinantOUT.txt", "w") as file_out:
        file_out.write(f"Eroare la citirea datelor de intrare: {str(e)}")
    exit()

# Verificarea restricțiilor
if not are_restricții_valide(n, matrice):
    with open("determinantOUT.txt", "w") as file_out:
        file_out.write("Datele de intrare nu respecta restrictiile impuse.")
    exit()

# Calculul determinantului
determinant = calcul_determinant(matrice)

# Scrierea rezultatului în fișierul de ieșire
with open("determinantOUT.txt", "w") as file_out:
    file_out.write(str(determinant))