4215 - Alipit

De la Universitas MediaWiki

Sursă: [1]

Cerinţa

Să se verifice dacă un număr natural n este “alipit”.

Date de intrare

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

Date de ieşire

Dacă datele introduse sunt corecte, pe ecran se va afișa "Datele introduse sunt corecte.", apoi programul va afișa mesajul DA dacă n este “alipit”, sau mesajul NU în caz contrar . În cazul în care datele introduse nu sunt corecte, se va afișa pe ecran mesajul "Datele introduse nu sunt corecte.".

Restricții și precizări

  • 1 ⩽ n ⩽100.000.000.000

Exemplu

Intrare
1212
Ieșire
Datele introduse sunt corecte.
DA

Rezolvare

#4215

def verificare_numar(n):
    if not isinstance(n, int) or n < 1 or n > 100000000000:
        return False
    return True

def este_alipit(n):
    numar = str(n)
    lungime = len(numar)
    
    # parcurgem toate lungimile posibile pentru un șir repetat
    for lungime_subsir in range(1, lungime // 2 + 1):
        # extragem șirul repetat
        subsir = numar[:lungime_subsir]
        # verificam daca șirul se poate repeta pentru a forma numarul dat
        if subsir * (lungime // lungime_subsir) + subsir[:lungime % lungime_subsir] == numar:
            return True
    return False

if __name__ == "__main__":
    n = int(input("Introduceti un numar natural: "))
    if verificare_numar(n):
        print("Datele introduse sunt corecte.")
        if este_alipit(n):
            print("DA")
        else:
            print("NU")
    else:
        print("Datele introduse nu sunt corecte.")

Explicație rezolvare

Funcția verificare_numar(n) primește ca parametru un număr întreg n și returnează True dacă n este un număr natural între 1 și 100000000000 și False în caz contrar. Aceasta se realizează prin verificarea dacă n nu este un număr întreg (utilizând funcția isinstance) sau dacă este mai mic decât 1 sau mai mare decât 100000000000.

Funcția este_alipit(n) primește ca parametru un număr întreg n și returnează True dacă n este "alipit" și False în caz contrar. Pentru a verifica acest lucru, se convertește numărul la un șir de caractere (numar = str(n)) și se calculează lungimea acestuia (lungime = len(numar)). Se parcurg toate lungimile posibile pentru un șir repetat, începând cu lungimea 1 și mergând până la jumătate din lungimea totală a șirului (for lungime_subsir in range(1, lungime // 2 + 1):). Se extrage șirul repetat (subsir = numar[:lungime_subsir]) și se verifică dacă acesta poate fi repetat de un număr de ori astfel încât să formeze numărul dat (if subsir * (lungime // lungime_subsir) + subsir[:lungime % lungime_subsir] == numar:). În caz afirmativ, se returnează True. În caz contrar, se continuă parcurgerea lungimilor posibile pentru șirul repetat până la epuizarea acestora, moment în care se returnează False.

Funcția principală se ocupă de interacțiunea cu utilizatorul și afișează rezultatul final în funcție de valorile returnate de funcțiile anterioare. Se citeste numarul de la tastatură (n = int(input("Introduceti un numar natural: "))) și se verifică dacă datele introduse sunt corecte folosind funcția verificare_numar(n). Dacă datele sunt corecte, se afișează mesajul corespunzător (print("Datele introduse sunt corecte.")) și se verifică dacă numărul este "alipit" folosind funcția este_alipit(n). În funcție de rezultatul obținut, se afișează mesajul "DA" sau "NU". Dacă datele introduse nu sunt corecte, se afișează mesajul corespunzător (`print("Datele introduse nu sunt corecte.").