3348 - Suma Puteri 2: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: ==Cerință== Se dă un număr natural n. Descompuneți numărul n ca sumă de puteri ale lui 2. ==Date de intrare== Programul citește de la tastatură numărul n. ==Date de ieșire== Programul va afișa pe ecran, în ordine crescătoare, separate prin câte un spațiu, puterile lui 2 care au suma n. ==Restricții de precizări== *1 ⩽ n ⩽ 2^31 ==Exemplul 1== ;Intrare :43 ;Ieșire :Datele introduse corespund restricțiilor impuse. :1 :2 :8 :32 == Rezolvare ==...
 
No edit summary
 
(5 intermediate revisions by 2 users not shown)
Line 1: Line 1:


==Cerință==
==Cerință==
Se dă un număr natural n. Descompuneți numărul n ca sumă de puteri ale lui 2.
Se dă un număr natural '''n'''. Descompuneți numărul '''n''' ca sumă de puteri ale lui 2.
==Date de intrare==
==Date de intrare==
Programul citește de la tastatură numărul n.
Programul citește de la tastatură numărul '''n'''.
==Date de ieșire==
==Date de ieșire==
Programul va afișa pe ecran, în ordine crescătoare, separate prin câte un spațiu, puterile lui 2 care au suma n.
Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele de intrare corespund restricțiilor impuse." și programul va afișa pe ecran, în ordine crescătoare, separate prin câte un spațiu, puterile lui 2 care au suma '''n'''. În caz contrar, se va afișa pe ecran: "Datele de intrare nu corespund restricțiilor impuse."
 
==Restricții de precizări==
==Restricții de precizări==
*1 ⩽ n ⩽ 2^31
*1 ⩽ '''n''' ⩽ 2^31
==Exemplul 1==
==Exemplul 1==
;Intrare
;Intrare
Line 25: Line 26:
:32
:32


== Rezolvare ==
==Rezolvare==
<syntaxhighlight lang="python" line="1" start="1">
=== Rezolvare ver. 1===
n = int(input("Introduceți numărul n: "))
<syntaxhighlight lang="python" line="1">
puteri = []
def validare(n):
for i in range(0, n.bit_length()):
    # Verifică dacă n este format doar din cifre și dacă este între 1 și 2^31 - 1
     if n & (1 << i):
    return n.isdigit() and 1 <= int(n) < pow(2, 31)
         puteri.append(2**i)
 
print(*puteri)
def descompunere_in_puteri_de_2(n):
    puteri_de_2 = [] # Lista pentru a stoca puterile de 2
    k = 0  # Contorul puterilor de 2
    while 2 ** k <= n:  # Găsește cel mai mare exponent k pentru care 2^k este mai mic sau egal cu n
        k += 1
    k -= 1  # Scade 1 din k pentru a obține cel mai mare exponent valid
    while k >= 0:  # Descompune n în sumă de puteri de 2
        if 2 ** k <= n:
            puteri_de_2.append(2 ** k) # Adaugă puterea de 2 la lista puteri_de_2
            n -= 2 ** k  # Scade puterea de 2 din n pentru a obține restul
        k -= 1  # Scade 1 din k pentru a trece la următorul exponent mai mic
    return puteri_de_2[::-1]  # Returnează lista puterilor de 2 în ordine descrescătoare
 
 
if __name__ == '__main__':
    n = input("Introduceți numărul n: ")
     if validare(n):
        n = int(n)
        print("Datele introduse corespund restricțiilor impuse.")
        puteri_de_2 = descompunere_in_puteri_de_2(n)
         print("{}".format("\n".join(
            str(p) for p in puteri_de_2)))  # Afișează puterile de 2 separate pe linii
    else:
        print("Datele introduse nu corespund restricțiilor impuse.")


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 08:40, 25 April 2023

Cerință[edit | edit source]

Se dă un număr natural n. Descompuneți numărul n ca sumă de puteri ale lui 2.

Date de intrare[edit | edit source]

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

Date de ieșire[edit | edit source]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele de intrare corespund restricțiilor impuse." și programul va afișa pe ecran, în ordine crescătoare, separate prin câte un spațiu, puterile lui 2 care au suma n. În caz contrar, se va afișa pe ecran: "Datele de intrare nu corespund restricțiilor impuse."

Restricții de precizări[edit | edit source]

  • 1 ⩽ n ⩽ 2^31

Exemplul 1[edit | edit source]

Intrare
43
Ieșire
Datele introduse corespund restricțiilor impuse.
1
2
8
32

Rezolvare[edit | edit source]

Rezolvare ver. 1[edit | edit source]

<syntaxhighlight lang="python" line="1"> def validare(n):

   # Verifică dacă n este format doar din cifre și dacă este între 1 și 2^31 - 1
   return n.isdigit() and 1 <= int(n) < pow(2, 31)

def descompunere_in_puteri_de_2(n):

   puteri_de_2 = []  # Lista pentru a stoca puterile de 2
   k = 0  # Contorul puterilor de 2
   while 2 ** k <= n:  # Găsește cel mai mare exponent k pentru care 2^k este mai mic sau egal cu n
       k += 1
   k -= 1  # Scade 1 din k pentru a obține cel mai mare exponent valid
   while k >= 0:  # Descompune n în sumă de puteri de 2
       if 2 ** k <= n:
           puteri_de_2.append(2 ** k)  # Adaugă puterea de 2 la lista puteri_de_2
           n -= 2 ** k  # Scade puterea de 2 din n pentru a obține restul
       k -= 1  # Scade 1 din k pentru a trece la următorul exponent mai mic
   return puteri_de_2[::-1]  # Returnează lista puterilor de 2 în ordine descrescătoare


if __name__ == '__main__':

   n = input("Introduceți numărul n: ")
   if validare(n):
       n = int(n)
       print("Datele introduse corespund restricțiilor impuse.")
       puteri_de_2 = descompunere_in_puteri_de_2(n)
       print("{}".format("\n".join(
           str(p) for p in puteri_de_2)))  # Afișează puterile de 2 separate pe linii
   else:
       print("Datele introduse nu corespund restricțiilor impuse.")

</syntaxhighlight>