1944 - Suma 6

De la Universitas MediaWiki

Sursa: [1]


Cerinţa

La ultima oră de matematică, Ionel a învățat despre numere speciale. Acestea sunt numere naturale cu număr impar de cifre care au prima cifră egală cu ultima. Ionel a primit ca temă să analizeze un șir format din numere având număr impar de cifre. El trebuie să determine suma cifrelor din mijloc, de la numerele speciale care se găsesc în șirul dat.
Se citește numărul natural numar și apoi se citesc numar numere naturale având fiecare număr impar de cifre. Să se calculeze suma cifrelor din mijlocul numerelor speciale din șirul dat.

Date de intrare

Fișierul de intrare suma6.in conține pe prima linie numărul natural numar. Pe a doua linie în fișier, se găsesc separate prin câte un spațiu numar numere naturale, fiecare având număr impar de cifre.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi, fișierul de ieșire suma6.out va conține pe prima linie un număr ce reprezintă suma cifrelor din mijlocul numerelor speciale din șirul dat. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse."'.

Restricţii şi precizări

  • 1numar1000
  • cele numar numere au cel mult nouă cifre
  • pentru 30% dintre teste cele numar numere au exact trei cifre

Exemple

Exemplul 1

suma6.in
5
122 13501 407 212 49974
Ecran
Datele sunt introduse corect.
suma6.out
15


Explicație

Numerele speciale din șirul dat sunt: 13501, 212 și 49974. Suma cifrelor din mijlocul lor este: s= 5 + 1 + 9 = 15.

Rezolvare

# 1944

def este_numar_special(numar):
    if len(numar) % 2 == 0:
        return False
    if numar[0] != numar[-1]:
        return False
    return True


def citeste_date():
    with open("suma6.in", "r") as f:
        numar = int(f.readline())
        numere = f.readline().split()

    if numar < 1 or numar > 1000:
        print("Datele nu corespund restricțiilor impuse.")
        return []

    numere_speciale = []
    for n in numere:
        if este_numar_special(n):
            numere_speciale.append(n)

    return numere_speciale


def calculeaza_suma_cifrelor(numere_speciale):
    suma = 0
    for n in numere_speciale:
        mijloc = len(n) // 2
        cifre_mijloc = [int(x) for x in n[mijloc - 1:mijloc + 2]]
        suma += sum(cifre_mijloc)

    return suma


def main():
    numere_speciale = citeste_date()

    if len(numere_speciale) == 0:
        return

    suma = calculeaza_suma_cifrelor(numere_speciale)

    print("Datele sunt introduse corect.")
    with open("suma6.out", "w") as f:
        f.write(str(suma))


if __name__ == "__main__":
    main()

Explicație rezolvare

   Funcția este_numar_special(numar) primește un număr sub formă de string și verifică dacă acesta este un număr special, adică are un număr impar de cifre și prima cifră este egală cu ultima cifră. Returnează True dacă numărul este special și False altfel.
Funcția citeste_date() citește datele din fișierul de intrare suma6.in. Aceasta verifică dacă numărul de numere din fișier este între 1 și 1000, apoi citește fiecare număr sub formă de string și verifică dacă este un număr special folosind funcția este_numar_special(numar). Returnează o listă cu numerele speciale din șirul dat.
Funcția calculeaza_suma_cifrelor(numere_speciale) primește o listă de numere speciale sub formă de string și calculează suma cifrelor din mijlocul acestora, iterează prin fiecare număr special și extrage cifrele din mijlocul acestuia (2 sau 3 cifre, depinde de numărul de cifre al numărului special) și calculează suma acestor cifre, apoi returnează suma finală.
Funcția main() apelează funcția citeste_date() și verifică dacă lista returnată nu este goală. Dacă lista nu este goală, apelează funcția calculeaza_suma_cifrelor(numere_speciale) și afișează mesajul "Datele sunt introduse corect." și scrie rezultatul în fișierul de ieșire suma6.out. Altfel, funcția se încheie fără a face nimic.
Ultima linie verifică dacă acest fișier a fost rulat ca program principal și apelează funcția main() în acest caz.