3271 - Pereche CMMDC

De la Universitas 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

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.")

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.