3271 - Pereche CMMDC

From Bitnami MediaWiki

Cerinţa

Se dă un șir de n perechi de numere naturale nenule. Să se determine perechea pentru care cel mai mare divizor comun este maxim. Dacă există mai multe asemenea perechi, se va determina aceea pentru care suma valorilor este maximă. Dacă există mai multe asemenea perechi, se va determina prima din șir.

Date de intrare

Programul citește de la tastatură numărul n, iar apoi n perechi de numere naturale.

Date de ieşire

Programul va afișa pe ecran două numere, separate printr-un spațiu, reprezentând perechea determinată.

Restricții și precizări

  • n ∈ Ν
  • 0 ⩽ n ⩽ 1.000
  • valorile din cele n numere citite vor fi mai mici decât 2^31

Exemplu1

Intrare
4
12 18
16 12
18 30
25 35
Ieșire
Datele de intrare corespund restricțiilor impuse.
18 30

Exemplu2

Intrare
3
29 31
16 12
15 45
Ieșire
Datele de intrare corespund restricțiilor impuse.
15 45

Rezolvare

<syntaxhighlight lang="python" line> def verificare_numar(numar):

   if numar.isdigit() and 0 <= int(numar) <= 2**31-1:
       return True
   return False


def verificare_n(n):

   if 0 <= n <= 1000:
       return True
   return False


def CMD(numar1, numar2):

   while numar2:
       rest = numar1 % numar2
       numar1, numar2 = numar2, rest
   cmmdc = numar1
   return cmmdc


if __name__ == '__main__':

   n = int(input())
   cmmdc_maxim = 0
   suma_maxima_perechiilor = 0
   perechea_cu_suma_maxima = None
   if verificare_n(n):
       date = True
       for i in range(n):
           pereche = input().split()
           numar1, numar2 = pereche[0], pereche[1]
           if verificare_numar(numar1) and verificare_numar(numar2):
               numar1, numar2 = int(numar1), int(numar2)
               cmmdc = CMD(numar1, numar2)
               suma_perechii = numar1 + numar2
               if cmmdc > cmmdc_maxim:
                   cmmdc_maxim = cmmdc
                   suma_maxima_perechiilor = suma_perechii
                   perechea_cu_suma_maxima = (numar1, numar2)
               elif cmmdc == cmmdc_maxim and suma_perechii > suma_maxima_perechiilor:
                   suma_maxima_perechiilor = suma_perechii
                   perechea_cu_suma_maxima = (numar1, numar2)
           else:
               date = False
       if date:
           print("\nDatele de intrare corespund restricțiilor impuse.\n")
           print(perechea_cu_suma_maxima[0], perechea_cu_suma_maxima[1])
       else:
           print("Datele de intrare nu corespund restricțiilor impuse.")
   else:
       print("Datele de intrare nu corespund restricțiilor impuse.")

</syntaxhighlight> Acest program citeste un numar n, citeste n perechi de numere întregi (citite ca string-uri), și determină perechea cu suma maximă dintre toate perechile care au cel mai mare divizor comun (cmmdc). Pentru fiecare pereche de numere, programul calculează cmmdc-ul și suma acestora și le compară cu valorile maxime până în prezent. Dacă cmmdc-ul este mai mare decât cel mai mare cmmdc de până acum, valorile maxime sunt actualizate cu valorile perechii curente, altfel dacă cmmdc-ul este același cu cel mai mare cmmdc de până acum, atunci se compară suma curentă a perechii cu suma maximă de până acum și se actualizează valorile maxime în consecință. Programul afișează perechea cu cea mai mare sumă. Programul verifică dacă datele de intrare corespund restricțiilor impuse.