2620 – FNext Number

De la Universitas MediaWiki

Sursa: FNext Number


Cerinţă

Se primește ca parametru un număr natural nenul n și returnează cel mai mic număr natural, strict mai mare decât n, care are în reprezentarea în baza 2 același număr de biți de 1 ca și n.

Date de intrare

Programul va citi de la tastatură valoarean.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele introduse sunt corecte!", apoi va afișa cel mai mic număr natural, strict mai mare decât n, care are în reprezentarea în baza 2 același număr de biți de 1 ca și n. În cazul în care datele nu respectă restricțiile, se va afișa mesajul "Datele introduse nu sunt corecte!".

Restricţii şi precizări

  • n > 0

Exemple

Exemplul 1

Intrare
Introduceti numarul: 30
Ieșire
Datele introduse sunt corecte!
39

Exemplul 2

Intrare
Introduceti numarul: 456
Ieșire
Datele introduse sunt corecte!
464

Exemplul 3

Intrare
Introduceti numarul: -5
Ieșire
Datele introduse sunt incorecte!

Rezolvare

def is_integer(value):
    return value.isdigit()


def verificare_nr(n):
    if is_integer(n):
        if 0 < int(n):
            return n
        else:
            print("Datele introduse sunt incorecte!")
            exit()
    else:
        print("Datele introduse sunt incorecte!")
        exit()


def next_number(n: int) -> int:
    numar_de_biti_de_1 = bin(n).count('1')
    while True:
        n += 1
        if bin(n).count('1') == numar_de_biti_de_1:
            return n


if __name__ == '__main__':
    n = input("Introduceti numarul: ")
    verificare_nr(n)
    print("Datele introduse sunt corecte!")
    print(next_number(int(n)))

Explicație rezolvare

  • Funcția is_integer(value) verifică dacă un șir de caractere reprezintă un număr întreg pozitiv și returnează True sau False în funcție de acest lucru.
  • Funcția verificare_nr(n) verifică dacă numărul primit ca parametru este un număr natural nenul și îl returnează dacă este corect, altfel afișează un mesaj de eroare și încheie programul cu funcția exit().
  • Funcția next_number(n) primește un număr natural n și calculează cel mai mic număr natural, strict mai mare decât n, care are în reprezentarea în baza 2 același număr de biți de 1 ca și n.
  • În interiorul funcției next_number(n) se numără numărul de biți de 1 din reprezentarea în baza 2 a lui n prin utilizarea funcției bin(n), care transformă numărul n în reprezentarea sa în baza 2 sub formă de șir de caractere, și apoi numărând câte biți de 1 conține acest șir de caractere prin utilizarea metodei count('1').
  • Folosind un ciclu infinit, se verifică fiecare număr natural, începând de la n + 1, prin incrementarea lui cu 1 în fiecare iterație și numărarea numărului de biți de 1 din reprezentarea sa în baza 2. Dacă numărul de biți de 1 din reprezentarea în baza 2 a numărului verificat este egal cu cel al lui n, se returnează acest număr.
  • În programul principal se primește numărul n de la utilizator prin intermediul funcției input() și se verifică dacă acesta este un număr natural nenul prin apelul funcției verificare_nr(n). Dacă acesta este corect, se afișează mesajul "Datele introduse sunt corecte!" și se calculează cel mai mic număr natural care are în reprezentarea în baza 2 același număr de biți de 1 ca și n prin apelul funcției next_number(int(n)), care primește numărul n sub forma unui întreg. Rezultatul este afișat prin intermediul funcției print().