3672 - Calculeaza pe n: Difference between revisions
No edit summary |
|||
(2 intermediate revisions by the same user not shown) | |||
Line 21: | Line 21: | ||
:1 | :1 | ||
;Iesire | ;Iesire | ||
:Datele introduse corespund restrictiilor impuse | |||
:0 | :0 | ||
Line 28: | Line 28: | ||
:0 | :0 | ||
;Iesire | ;Iesire | ||
:Datele introduse nu corespund restrictiilor impuse | |||
== Rezolvare == | == Rezolvare == | ||
<syntaxhighlight lang="python3" line="1"> | <syntaxhighlight lang="python3" line="1"> | ||
def numar_minim_operatii(n): | |||
dp = [float('inf')] * (n + 1) | |||
dp[1] = 0 | |||
for i in range(1, n + 1): | |||
if i * 2 <= n: | |||
dp[i * 2] = min(dp[i * 2], dp[i] + 1) | |||
if i * 3 <= n: | |||
dp[i * 3] = min(dp[i * 3], dp[i] + 1) | |||
if i + 1 <= n: | |||
dp[i + 1] = min(dp[i + 1], dp[i] + 1) | |||
return dp[n] if dp[n] != float('inf') else 0 | |||
def verificare_date_intrare(n): | |||
return 1 <= n <= 1000000 | |||
# Citire număr de la tastatură | |||
n = int(input("Introduceți numărul n: ")) | n = int(input("Introduceți numărul n: ")) | ||
# | # Verificare date de intrare | ||
rezultat = | if not verificare_date_intrare(n): | ||
print(f"Numărul minim de operații pentru a obține {n} este {rezultat} | print("Datele introduse nu corespund restricțiilor impuse") | ||
else: | |||
# Calcul și afișare rezultat | |||
rezultat = numar_minim_operatii(n) | |||
print(f"Numărul minim de operații pentru a obține {n} este: {rezultat}") | |||
</syntaxhighlight> | </syntaxhighlight> |
Latest revision as of 12:31, 29 December 2023
Cerinta[edit | edit source]
Se citește de la tastatură număr natural n. Pornind de la valoarea 1, asupra valorii curente x se pot aplica următoarele trei operații: înmulțire cu 2, înmulțire cu 3 sau adunare cu 1. De exemplu, dacă x=1 atunci se poate obține 2 (prin înmulțirea cu 2 sau prin adunarea cu 1) sau 3 (prin înmulțirea cu 3).
Calculați numărul minim de operații necesare pentru a obține numărul n începând de la numărul 1.
Date de intrare[edit | edit source]
Programul citește de la tastatură numărul n.
Date de iesire[edit | edit source]
Programul va afișa pe ecran numărul k, reprezentând numărul minim de operații pentru obținerea numărului n pornind de la 1 sau valoarea 0 dacă nu se poate obține n.
Restrictii si precizari[edit | edit source]
- 1 ⩽ n ⩽ 1.000.000
Exemplul 1[edit | edit source]
- Intrare
- 1
- Iesire
- Datele introduse corespund restrictiilor impuse
- 0
Exemplul 2[edit | edit source]
- Intrare
- 0
- Iesire
- Datele introduse nu corespund restrictiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> def numar_minim_operatii(n):
dp = [float('inf')] * (n + 1) dp[1] = 0
for i in range(1, n + 1): if i * 2 <= n: dp[i * 2] = min(dp[i * 2], dp[i] + 1) if i * 3 <= n: dp[i * 3] = min(dp[i * 3], dp[i] + 1) if i + 1 <= n: dp[i + 1] = min(dp[i + 1], dp[i] + 1)
return dp[n] if dp[n] != float('inf') else 0
def verificare_date_intrare(n):
return 1 <= n <= 1000000
- Citire număr de la tastatură
n = int(input("Introduceți numărul n: "))
- Verificare date de intrare
if not verificare_date_intrare(n):
print("Datele introduse nu corespund restricțiilor impuse")
else:
# Calcul și afișare rezultat rezultat = numar_minim_operatii(n) print(f"Numărul minim de operații pentru a obține {n} este: {rezultat}")
</syntaxhighlight>