1582 - Max Min

De la Universitas MediaWiki

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