1797 - Sir Div 3

De la Universitas MediaWiki

Cerinţa

Se dă următorul şir de numere naturale: (1, 21, 321, 4321, 54321, 654321, 7654321, 87654321, 987654321, 10987654321, ...). Al x-lea termen este format prin alipirea primelor x numere naturale nenule. Determinaţi câte din primele n numere ale şirului sunt divizibile cu 3.

Date de intrare

Programul citește de la tastatură numărul n.

Date de ieşire

Dacă datele sunt introduse corect,pe ecran se va afișa :"Datele sunt introduse corect.",apoi pe un rând nou numărul c reprezentând câte din primele n numere din şir sunt divizibile cu 3..În cazul contrar,se va afișa pe ecran "Datele nu corespund restricțiilor impuse.".

Restricții și precizări

  • 0 ⩽ n ⩽ 2.000.000.000

Exemplu

Intrare
3
Ieșire
Datele sunt introduse corect.
2

Explicație

Primele 3 numere sunt : 1, 21, 321. Din cele 3 numere doar 2 sunt divizibile cu 3. (21 si 321).

Rezolvare

# Funcția  verifică dacă numărul introdus este un număr întreg și se încadrează în intervalul specificat
def validare_date(n):
    if not isinstance(n, int):
        return False
    if not 0 <= n <= 2_000_000_000:
        return False
    return True

# Funcția calculează suma cifrelor dintr-un număr dat
def calc_suma_cifrelor(n):
    suma = 0
    while n > 0:
        suma += n % 10  # adaugă cifra din unități la sumă
        n //= 10  # elimină cifra din unități
    return suma

# Funcția calculează numărul de numere formate din cifre consecutive de la 1 la n, care sunt divizibile cu 3
def numere_divizibile_cu_3(n):
    nr = 0
    termen = 0
    for i in range(1, n + 1):
        termen = termen * 10 + i  # adaugă cifra următoare la termenul curent
        if calc_suma_cifrelor(termen) % 3 == 0:  # verifică dacă suma cifrelor este divizibilă cu 3
            nr += 1  # incrementează numărul de numere divizibile cu 3
    return nr

if __name__ == '__main__':
    n = input()

    try:
        n = int(n)  # încercăm să convertim numărul introdus într-un număr întreg
    except ValueError:  # dacă conversia nu reușește, afișăm un mesaj de eroare și încheiem programul
        print("Datele nu corespund restricțiilor impuse.")
        exit()

    if validare_date(n):  # dacă numărul este valid, afișăm mesajul de confirmare și numărul de numere divizibile cu 3
        print("\nDatele sunt introduse corect.\n")
        print(numere_divizibile_cu_3(n))
    else:  # dacă numărul nu este valid, afișăm un mesaj de eroare
        print("Datele nu corespund restricțiilor impuse.")