4214 – Două Numere

De la Universitas MediaWiki

Sursa: Doua Numere


Cerinţă

Se dă un șir cu n elemente întregi. Subprogramul returnează suma maximă care poate fi obținută adunând două numere din sir care au aceeași sumă a cifrelor. Dacă nu există două numere cu aceeași sumă a cifrelor, atunci funcția va returna -1.

Date de intrare

Programul va citi de la tastatură valoarean, apoi n numere întregi reprezentând elementele șirului.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele introduse sunt corecte!", apoi se va afișa suma elementelor precizate mai sus. În cazul în care datele nu respectă restricțiile, se va afișa mesajul "Datele introduse nu sunt corecte!".

Restricţii şi precizări

  • 2 <= n <= 100.000
  • valorile elementelor șirului vor fi < 1.000.000.000

Exemple

Exemplul 1

Intrare
Introduceti numarul de elemente a sirului: 5
Introduceti 5 numere separate prin spatiu:14 66 41 50 93
Ieșire
Datele introduse sunt corecte!
Suma maxima care poate fi obtinuta este: 159

Exemplul 2

Intrare
Introduceti numarul de elemente a sirului: 4
Introduceti 4 numere separate prin spatiu:123 12 3 5
Ieșire
Datele introduse sunt corecte!
Suma maxima care poate fi obtinuta este: 15

Exemplul 3

Intrare
Introduceti numarul de elemente a sirului: 6
Introduceti 6 numere separate prin spatiu:1231 31 213 1
Ieșire
Datele introduse sunt incorecte!

Rezolvare

def is_integer(value):
    return value.isdigit()


def verificare_nr_elemente(n):
    if is_integer(n):
        if 2 < int(n) < 1000000:
            return n
        else:
            print("Datele introduse sunt incorecte!")
            exit()
    else:
        print("Datele introduse sunt incorecte!")
        exit()


def verificare_vector(n, vector):
    if len(vector) != int(n):
        print("Datele introduse sunt incorecte!")
        exit()
    else:
        for i in vector:
            if is_integer(i):
                if int(i) < 1000000000:
                    continue
                else:
                    print("Datele introduse sunt incorecte!")
                    exit()
            else:
                print("Datele introduse sunt incorecte!")
                exit()


def sum_cif(n):
    s = 0
    while n > 0:
        s += n % 10
        n //= 10
    return s


def suma_max(a, n):
    max_sum = -1
    for i in range(int(n)):
        for j in range(i+1, int(n)):
            if sum_cif(a[i]) == sum_cif(a[j]):
                max_sum = max(max_sum, a[i]+a[j])
    return max_sum


if __name__ == '__main__':
    n = input("Introduceti numarul de elemente a sirului: ")
    verificare_nr_elemente(n)
    elem = input(f"Introduceti {n} numere separate prin spatiu:").split()
    verificare_vector(n, elem)
    lst_int = list(map(int, elem))
    print("Datele introduse sunt corecte!")
    print("Suma maxima care poate fi obtinuta este:",suma_max(lst_int, n))

Explicație rezolvare

Acest program are ca scop găsirea sumei maxime care poate fi obținută prin adunarea a două numere dintr-un tablou, care au aceeași sumă a cifrelor. În cazul în care nu există două numere cu aceeași sumă a cifrelor, programul va returna -1.

Funcția is_integer: Această funcție primește un parametru numit value și verifică dacă acesta este un număr întreg (adică este format din cifre). În caz afirmativ, funcția returnează True, în caz contrar, returnează False.

Funcția verificare_nr_elemente: Această funcție primește un parametru numit n și verifică dacă acesta este un număr întreg cuprins între 2 și 1000000. Dacă este adevărat, funcția returnează valoarea lui n, în caz contrar afișează un mesaj de eroare și întrerupe programul cu ajutorul funcției exit().

Funcția verificare_vector: Această funcție primește două parametri: n și vector. Ea verifică dacă lungimea vectorului este egală cu n și dacă toate elementele vectorului sunt numere întregi cuprinse între 0 și 1000000000. Dacă totul este corect, funcția nu returnează nimic, în caz contrar afișează un mesaj de eroare și întrerupe programul cu ajutorul funcției exit().

Funcția sum_cif: Această funcție primește un parametru numit n și calculează suma cifrelor acestui număr utilizând operatorul modulo (%) și operatorul de împărțire întreagă (//). Funcția returnează suma cifrelor.

Funcția suma_max: Această funcție primește doi parametri: a și n. Funcția parcurge două bucle for pentru a compara suma cifrelor a fiecărui element din vector cu suma cifrelor ale celorlalte elemente și pentru a găsi perechi de numere cu aceeași sumă a cifrelor. Dacă este găsită o pereche cu aceeași sumă a cifrelor, suma celor două numere este comparată cu valoarea maximă anterioară și, dacă este mai mare, aceasta este setată ca noua valoare maximă. Funcția returnează valoarea maximă găsită. Dacă nu este găsită nicio pereche cu aceeași sumă a cifrelor, funcția returnează -1.

Funcția principală: Funcția principală primește de la utilizator lungimea vectorului și vectorul, verifică dacă acestea sunt corecte cu ajutorul funcțiilor verificare_nr_elemente și verificare_vector, apoi calculează suma maximă a două numere din vector cu aceeași sumă a cifrelor cu ajutorul funcției suma_max. Dacă suma maximă este -1, funcția afișează un mesaj corespunzător, în caz contrar afișează valoarea găsită.