1582 - Max Min

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

sursa: [1]

Cerinţa

Se citesc de la tastatură n numere naturale. Să se determine numărul a cărui sumă a cifrelor este cea mai mare, respectiv cea mai mică.

Date de intrare

Programul citește de la tastatură numărul n, iar apoi n numere naturale, separate prin spații.

Date de ieşire

Minimul va fi afișat pe primul rând și maximul pe al doilea rând.

Restricții și precizări

  • 1 ≤ n ≤ 1000
  • cele n numere citite sunt mai mici decât 2.000.000.000
  • dacă există mai multe numere cu aceeași sumă minimă/maximă se va afișa primul găsit

Exemplu

Intrare
5
145
225
198
326
874
Ieșire
225
874

Explicație

145 -> 1+4+5=10 225 -> 2+2+5=9 (minimul) 198 -> 1+9+8=18 326 -> 3+2+6=11 874 -> 8+7+4=19 (maximul)

Rezolvare

Rezolvare ver. 1

def citeste_numar_natural(mesaj):
    while True:
        try:
            nr = int(input(mesaj))
            if nr <= 0:
                raise ValueError("Introduceți un număr natural nenul.")
            return nr
        except ValueError as e:
            print(f"Eroare: {e}")

def citeste_numar_natural_pozitiv(mesaj):
    while True:
        try:
            nr = int(input(mesaj))
            if nr < 0:
                raise ValueError("Introduceți un număr natural pozitiv.")
            return nr
        except ValueError as e:
            print(f"Eroare: {e}")

def calculeaza_suma_cifrelor(numar):
    suma_cifre = 0
    while numar:
        suma_cifre += numar % 10
        numar //= 10
    return suma_cifre

if __name__ == "__main__":
    nr_numere = citeste_numar_natural("Introduceți numărul de numere naturale: ")
    max_sum = float('-inf')
    min_sum = float('inf')
    numar_max = None
    numar_min = None

    for i in range(nr_numere):
        numar = citeste_numar_natural_pozitiv(f"Introduceți numărul {i + 1}: ")
        suma_cifre = calculeaza_suma_cifrelor(numar)

        if suma_cifre > max_sum:
            max_sum = suma_cifre
            numar_max = numar
        if suma_cifre < min_sum:
            min_sum = suma_cifre
            numar_min = numar

    print("Datele sunt introduse corect.")
    print(f"Numărul cu suma cifrelor maximă este {numar_max} și suma cifrelor sale este {max_sum}.")
    print(f"Numărul cu suma cifrelor minimă este {numar_min} și suma cifrelor sale este {min_sum}.")

Rezolvare ver. 2

# citirea numarului de la tastatura
while True:
    try:
        nr_numere = int(input("Introduceți numărul de numere naturale: "))
        if nr_numere <= 0:
            raise ValueError("Introduceți un număr natural nenul.")
        break
    except ValueError as e:
        print(f"Eroare: {e}")

# initializarea valorilor pentru suma maxima si minima
max_sum = float('-inf')
min_sum = float('inf')
numar_max = None
numar_min = None

# iteram de nr_numere ori pentru citirea numerelor si determinarea sumei lor
for i in range(nr_numere):
    while True:
        try:
            numar = int(input(f"Introduceți numărul {i + 1}: "))
            if numar < 0:
                raise ValueError("Introduceți un număr natural pozitiv.")
            break
        except ValueError as e:
            print(f"Eroare: {e}")

    # calculam suma cifrelor numarului si verificam daca aceasta este maxima sau minima
    suma_cifre = 0
    copie_numar = numar
    while copie_numar:
        suma_cifre += copie_numar % 10
        copie_numar //= 10
    if suma_cifre > max_sum:
        max_sum = suma_cifre
        numar_max = numar
    if suma_cifre < min_sum:
        min_sum = suma_cifre
        numar_min = numar

# afisam rezultatele
print("Datele sunt introduse corect.")
print(f"Numărul cu suma cifrelor maximă este {numar_max} și suma cifrelor sale este {max_sum}.")
print(f"Numărul cu suma cifrelor minimă este {numar_min} și suma cifrelor sale este {min_sum}.")