3348 - Suma Puteri 2: Difference between revisions
Vardai Erwin (talk | contribs) |
No edit summary |
||
(2 intermediate revisions by one other user not shown) | |||
Line 5: | Line 5: | ||
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== | ||
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 | ||
Line 27: | Line 28: | ||
==Rezolvare== | ==Rezolvare== | ||
=== Rezolvare ver. 1=== | === Rezolvare ver. 1=== | ||
<syntaxhighlight lang="python" line> | <syntaxhighlight lang="python" line="1"> | ||
def validare(n): | def validare(n): | ||
return n.isdigit() and 1 <= int(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): | def descompunere_in_puteri_de_2(n): | ||
puteri_de_2 = [] | puteri_de_2 = [] # Lista pentru a stoca puterile de 2 | ||
k = 0 | k = 0 # Contorul puterilor de 2 | ||
while 2 ** k <= n: | 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 | ||
k -= 1 | k -= 1 # Scade 1 din k pentru a obține cel mai mare exponent valid | ||
while k >= 0: | while k >= 0: # Descompune n în sumă de puteri de 2 | ||
if 2 ** k <= n: | if 2 ** k <= n: | ||
puteri_de_2.append(2 ** k) | puteri_de_2.append(2 ** k) # Adaugă puterea de 2 la lista puteri_de_2 | ||
n -= 2 ** k | n -= 2 ** k # Scade puterea de 2 din n pentru a obține restul | ||
k -= 1 | k -= 1 # Scade 1 din k pentru a trece la următorul exponent mai mic | ||
return puteri_de_2[::-1] | return puteri_de_2[::-1] # Returnează lista puterilor de 2 în ordine descrescătoare | ||
Line 53: | Line 54: | ||
puteri_de_2 = descompunere_in_puteri_de_2(n) | puteri_de_2 = descompunere_in_puteri_de_2(n) | ||
print("{}".format("\n".join( | print("{}".format("\n".join( | ||
str(p) for p in puteri_de_2))) | str(p) for p in puteri_de_2))) # Afișează puterile de 2 separate pe linii | ||
else: | else: | ||
print("Datele introduse nu corespund restricțiilor impuse.") | 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>