4215 - Alipit: Diferență între versiuni

De la Universitas MediaWiki
(Pagină nouă: Sursă: [https://www.pbinfo.ro/probleme/4215/alipit] == Cerinţa == Să se verifice dacă un număr natural '''numar''' este “alipit”. == Date de intrare == Programul citește de la tastatură numărul '''numar'''. == Date de ieşire == Programul va afișa pe ecran mesajul '''DA''' dacă '''numar''' este “alipit”, sau mesajul '''NU''' în caz contrar . == Restricții și precizări == * '''1 ⩽ numar ⩽100.000.000.000 ''' == Exemplu == ; Intrare : 1212 ; Ieși...)
 
Fără descriere a modificării
Linia 1: Linia 1:
Sursă: [https://www.pbinfo.ro/probleme/4215/alipit]
Sursă: [https://www.pbinfo.ro/probleme/4215/alipit]
== Cerinţa ==
== Cerinţa ==
Să se verifice dacă un număr natural '''numar''' este “alipit”.  
Să se verifice dacă un număr natural '''n''' este “alipit”.  
== Date de intrare ==
== Date de intrare ==
Programul citește de la tastatură numărul '''numar'''.
Programul citește de la tastatură numărul '''n'''.
== Date de ieşire ==
== Date de ieşire ==
Programul va afișa pe ecran mesajul '''DA''' dacă '''numar''' este “alipit”, sau mesajul '''NU''' în caz contrar .
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 ==
== Restricții și precizări ==
* '''1 ⩽ numar ⩽100.000.000.000 '''
* '''1 ⩽ n ⩽100.000.000.000 '''


== Exemplu ==
== Exemplu ==
Linia 13: Linia 13:
: 1212
: 1212
; Ieșire
; Ieșire
: "Datele introduse sunt corecte."
: DA
: DA


Linia 18: Linia 19:


<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
#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.")


numar = str(input().strip())
lungime = len(numar)


# parcurgem toate lungimile posibile pentru un șir repetat
for lungime_șir in range(1, lungime // 2 + 1):
    # extragem șirul repetat
    subșir = numar[:lungime_șir]
    # verificam daca șirul se poate repeta pentru a forma numarul dat
    if subșir * (lungime // lungime_șir) + subșir[:lungime % lungime_șir] == numar:
        print("DA")
        break
else:
    print("NU")


</syntaxhighlight>
</syntaxhighlight>
== 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.<br><br>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.<br><br>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.").

Versiunea de la data 28 aprilie 2023 17:25

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