3935 - determinanta: Difference between revisions

From Bitnami MediaWiki
No edit summary
 
(One intermediate revision by the same user not shown)
Line 40: Line 40:
<syntaxhighlight lang="python3" line="1">
<syntaxhighlight lang="python3" line="1">


def calc_determinant(matrix, size):
def este_intrare_valida(n, pozitii):
    # Verificăm dacă toate pozițiile sunt în limitele matricei
    for linie, coloana in pozitii:
        if not (1 <= linie <= n and 1 <= coloana <= n):
            return False
    return True
 
def citeste_intrare(numefisier):
    with open(numefisier, 'r') as fisier:
        n = int(fisier.readline())
        pozitii = [tuple(map(int, fisier.readline().split())) for _ in range(n)]
 
    if este_intrare_valida(n, pozitii):
        matrice = [[0] * n for _ in range(n)]
        for linie, coloana in pozitii:
            matrice[linie - 1][coloana - 1] = 1
        return matrice, n
    else:
        raise ValueError("Date de intrare nevalide")
 
def scrie_iesire(numefisier, rezultat):
    with open(numefisier, 'w') as fisier:
        fisier.write(str(rezultat) + '\n')
 
def calculeaza_determinant(matrice, dimensiune):
     # Cazul de bază: matrice de dimensiune 2x2
     # Cazul de bază: matrice de dimensiune 2x2
     if size == 2:
     if dimensiune == 2:
         return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]
         return matrice[0][0] * matrice[1][1] - matrice[0][1] * matrice[1][0]


     determinant = 0
     determinant = 0
     for i in range(size):
     for i in range(dimensiune):
         # Eliminăm linia și coloana corespunzătoare elementului selectat
         # Eliminăm linia și coloana corespunzătoare elementului selectat
         sub_matrix = [row[:i] + row[i+1:] for row in matrix[1:]]
         submatrice = [linie[:i] + linie[i+1:] for linie in matrice[1:]]
         sign = (-1) ** i
         semn = (-1) ** i
         determinant += sign * matrix[0][i] * calc_determinant(sub_matrix, size - 1)
         determinant += semn * matrice[0][i] * calculeaza_determinant(submatrice, dimensiune - 1)


     return determinant
     return determinant


def read_input(file_name):
if __name__ == "__main__":
     with open(file_name, 'r') as file:
     fisier_intrare = "determinantain.txt"
        n = int(file.readline())
    fisier_iesire = "determinantaout.txt"
        matrix = [[0] * n for _ in range(n)]
        for _ in range(n):
            l, c = map(int, file.readline().split())
            matrix[l-1][c-1] = 1
        return matrix, n


def write_output(file_name, result):
    try:
    with open(file_name, 'w') as file:
        # Citim matricea și dimensiunea din fișierul de intrare
         file.write(str(result) + '\n')
         matrice, dimensiune = citeste_intrare(fisier_intrare)


if __name__ == "__main__":
        # Calculăm determinantul
    input_file = "determinantain.txt"
        rezultat_determinant = calculeaza_determinant(matrice, dimensiune)
    output_file = "determinantaout.txt"


    # Citim matricea și dimensiunea din fișierul de intrare
        # Scriem rezultatul în fișierul de ieșire
    matrix, size = read_input(input_file)
        scrie_iesire(fisier_iesire, rezultat_determinant)
   
     except ValueError as e:
    # Calculăm determinantul
        print(f"Eroare: {e}")
    determinant_result = calc_determinant(matrix, size)
      
    # Scriem rezultatul în fișierul de ieșire
    write_output(output_file, determinant_result)




</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 11:18, 29 December 2023

Cerinta[edit]

Se consideră o matrice cu n linii şi n coloane şi elemente egale cu 0 sau 1. Să se calculeze determinantul matricei.

Date de intrare[edit]

Fișierul de intrare determinantain.txt conține pe prima linie numărul n, iar pe următoarele n linii câte o pereche de numere naturale l, c, reprezentând faptul că elementul matricei de pe linia l şi coloana c are valoarea 1.

Date de iesire[edit]

Fișierul de ieșire determinantaout.txt va conține pe prima linie valoarea determinantului matricei.

Restrictii si precizari[edit]

  • 2 ⩽ n ⩽ 100.000
  • 1 ⩽ l,c ⩽ n
  • Exceptând elementele din poziţiile (l,c), care sunt egale cu 1, celelalte elemente ale matricei au valoarea 0.

Exemplul 1[edit]

determinantain.txt
3
1 1
2 2
3 3
Datele introduse corespund restrictiilor impuse.
determinantaout.txt
1

Exemplul 2[edit]

determinantain.txt
3
2 2
3 3
2 2
Datele introduse nu corespund restrictiilor impuse

Rezolvare[edit]

<syntaxhighlight lang="python3" line="1">

def este_intrare_valida(n, pozitii):

   # Verificăm dacă toate pozițiile sunt în limitele matricei
   for linie, coloana in pozitii:
       if not (1 <= linie <= n and 1 <= coloana <= n):
           return False
   return True

def citeste_intrare(numefisier):

   with open(numefisier, 'r') as fisier:
       n = int(fisier.readline())
       pozitii = [tuple(map(int, fisier.readline().split())) for _ in range(n)]
   if este_intrare_valida(n, pozitii):
       matrice = [[0] * n for _ in range(n)]
       for linie, coloana in pozitii:
           matrice[linie - 1][coloana - 1] = 1
       return matrice, n
   else:
       raise ValueError("Date de intrare nevalide")

def scrie_iesire(numefisier, rezultat):

   with open(numefisier, 'w') as fisier:
       fisier.write(str(rezultat) + '\n')

def calculeaza_determinant(matrice, dimensiune):

   # Cazul de bază: matrice de dimensiune 2x2
   if dimensiune == 2:
       return matrice[0][0] * matrice[1][1] - matrice[0][1] * matrice[1][0]
   determinant = 0
   for i in range(dimensiune):
       # Eliminăm linia și coloana corespunzătoare elementului selectat
       submatrice = [linie[:i] + linie[i+1:] for linie in matrice[1:]]
       semn = (-1) ** i
       determinant += semn * matrice[0][i] * calculeaza_determinant(submatrice, dimensiune - 1)
   return determinant

if __name__ == "__main__":

   fisier_intrare = "determinantain.txt"
   fisier_iesire = "determinantaout.txt"
   try:
       # Citim matricea și dimensiunea din fișierul de intrare
       matrice, dimensiune = citeste_intrare(fisier_intrare)
       # Calculăm determinantul
       rezultat_determinant = calculeaza_determinant(matrice, dimensiune)
       # Scriem rezultatul în fișierul de ieșire
       scrie_iesire(fisier_iesire, rezultat_determinant)
   except ValueError as e:
       print(f"Eroare: {e}")


</syntaxhighlight>