0780 - Cmmdc Sum

From Bitnami MediaWiki
Revision as of 19:04, 24 April 2023 by Alexandra Leș (talk | contribs) (Pagină nouă: == Cerinţa == Se dă o matrice cu '''n''' linii şi '''n''' coloane şi elemente numere naturale. Calculaţi cel mai mare divizor comun al sumei elementelor de deasupra diagonalei principale și al sumei elementelor de sub diagonala principală. == Date de intrare == Programul citește de la tastatură numărul '''n''', iar apoi '''n*n''' numere naturale, separate prin spaţii, reprezentând elementele matricei, linie cu linie. == Date de ieşire == Dacă datele sunt introdu...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Cerinţa[edit | edit source]

Se dă o matrice cu n linii şi n coloane şi elemente numere naturale. Calculaţi cel mai mare divizor comun al sumei elementelor de deasupra diagonalei principale și al sumei elementelor de sub diagonala principală.

Date de intrare[edit | edit source]

Programul citește de la tastatură numărul n, iar apoi n*n numere naturale, separate prin spaţii, reprezentând elementele matricei, linie cu linie.

Date de ieşire[edit | edit source]

Dacă datele sunt introduse corect,pe ecran se va afișa :"Datele sunt introduse corect.",apoi pe un rând nou numărul D, reprezentând valoarea calculată.În cazul contrar,se va afișa pe ecran "Datele nu corespund restricțiilor impuse.".

Restricții și precizări[edit | edit source]

  • 1 ⩽ n ⩽ 20
  • elementele matricei vor fi mai mici decât 1.000.000
  • cel puţin un element situat deasupra diagnalei principale şi cel puţin un element situat sub diagonala principală sunt nenule

Exemplu[edit | edit source]

Date de intrare
4
8 3 5 6
5 5 6 5
3 8 6 5
8 4 8 8
Date de ieșire
Datele sunt introduse corect.
6

Explicație[edit | edit source]

Suma elementelor de sub diagonala principală este 36 iar cea a elementelor de deasupra diagonalei principale este 30. Cel mai mare divizor comun pentru 36 şi 30 este 6.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

def validare(n: int, a: list) -> str:

   # Verificăm dacă numărul de linii și de coloane este mai mare sau egal cu 1 și mai mic sau egal cu 20
   if n < 1 or n > 20:
       return False
   # Verificăm dacă fiecare element al matricei este mai mic decât 1.000.000
   for i in range(n):
       for j in range(n):
           if a[i][j] >= 1000000:
               return False
   # Verificăm dacă există cel puțin un element nenul deasupra diagonalei principale și unul sub diagonala principală
   deasupra = False
   sub = False
   for i in range(n):
       for j in range(n):
           if i < j and a[i][j] != 0:
               deasupra = True
           if i > j and a[i][j] != 0:
               sub = True
   if not deasupra or not sub:
       return False
   # Dacă toate restricțiile sunt respectate, returnăm un mesaj de confirmare
   return True


  1. Funcția de calculare a celui mai mare divizor comun

def calculeaza_cel_mai_mare_divizor_comun(n: int, a: list) -> int:

   sum_deasupra = 0
   sum_sub = 0
   # Parcurgem matricea și calculăm sumele elementelor situate deasupra și sub diagonala principală
   for i in range(n):
       for j in range(n):
           if i < j:
               sum_deasupra += a[i][j]
           elif i > j:
               sum_sub += a[i][j]
   # Verificăm care dintre cele doua sume este mai mare si aplicăm algoritmul Euclid pentru a calcula cel mai mare divizor comun
   if sum_deasupra < sum_sub:
       sum_deasupra, sum_sub = sum_sub, sum_deasupra
   while sum_deasupra % sum_sub != 0:
       rest = sum_deasupra % sum_sub
       sum_deasupra = sum_sub
       sum_sub = rest
   # Returnăm cel mai mare divizor comun
   return sum_sub

if __name__ == '__main__':

       # Citim numărul de linii și coloane al matricei
       n = int(input())
       # Citim matricea
       a = []
       for i in range(n):
           a.append(list(map(int, input().split())))
       # Verificăm dacă matricea respectă restricțiile impuse
       if validare(n, a) :
           print("\nDatele sunt introduse corect.\n")
           # Calculăm cel mai mare divizor comun și îl afișăm
           D = calculeaza_cel_mai_mare_divizor_comun(n, a)
           print(D)
       else:
           print("Datele nu corespund restrictiilor impuse.")


</syntaxhighlight>