4215 - Alipit

From Bitnami MediaWiki
Revision as of 17:25, 28 April 2023 by Tamas Claudia (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Sursă: [1]

Cerinţa[edit | edit source]

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

Date de intrare[edit | edit source]

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

Date de ieşire[edit | edit source]

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[edit | edit source]

  • 1 ⩽ n ⩽100.000.000.000

Exemplu[edit | edit source]

Intrare
1212
Ieșire
Datele introduse sunt corecte.
DA

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

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


</syntaxhighlight>

Explicație rezolvare[edit | edit source]

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