0780 - Cmmdc Sum

From Bitnami MediaWiki

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>