0960 - Termen k in sir: Difference between revisions
Adina Timiș (talk | contribs) |
Adina Timiș (talk | contribs) No edit summary |
||
Line 45: | Line 45: | ||
return pozitie_k - sectiune_maxima + 2 | return pozitie_k - sectiune_maxima + 2 | ||
if __name__ == "__main__": | |||
# citim valoarea lui k | # citim valoarea lui k | ||
k = int(input("Introduceti valoarea lui k: ")) | k = int(input("Introduceti valoarea lui k: ")) | ||
Line 57: | Line 57: | ||
print("Datele de intrare nu corespund restricțiilor impuse.") | print("Datele de intrare nu corespund restricțiilor impuse.") | ||
</syntaxhighlight> | </syntaxhighlight> |
Latest revision as of 21:21, 23 April 2023
Cerința[edit | edit source]
La testul de selecție la Centrul de Excelentă în Informatică din acest an, prima problemă ne cere să studiem un șir S de numere naturale nenule ai cărui primi termeni sunt: 1, 2, 1, 2, 3, 2, 1, 2, 3, 4, 3, 2, 1, 2, 3, 4, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1, 2, 3... să deducem regula prin care a fost construit și apoi să descoperim cel de-al k-lea termen al șirului S. Scrieţi un program care să determine cel de-al k-lea termen al șirului S.
Date de intrare[edit | edit source]
Programul citește de la tastatură numărul natural nenul k.
Date de ieșire[edit | edit source]
Programul va afișa pe ecran un număr natural reprezentând cel de-al K-lea termen al șirului S.
Restricții și precizări[edit | edit source]
- 1 ≤ K ≤ 2000000000, număr natural
- termenii șirului sunt numere naturale nenule strict mai mici decât 30000
Exemplul 1[edit | edit source]
- Intrare
- 20
- Ieșire
- 2
Exemplul 2[edit | edit source]
- Intrare
- 0
- Ieșire
- Datele de intrare nu corespund restricțiilor impuse.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line="1">
- 0960 - Termen k in sir
def k_termen(k):
# inițializăm variabilele pentru calcularea termenului k lungime_sectiune = 1 sectiune_inceput = 1 sectiune_maxima = 1 # iterăm până când găsim secțiunea în care se află k while k > lungime_sectiune: # scădem din k lungimea secțiunii curente k -= lungime_sectiune # actualizăm lungimea și începutul secțiunii lungime_sectiune += 2 sectiune_inceput += lungime_sectiune // 2 # actualizăm numărul maxim de secțiuni sectiune_maxima += 1 # calculăm poziția lui k, în secțiunea curentă pozitie_k = k - 1 # dacă poziția lui k este în prima jumătate a secțiunii, termenul este sectiune_maxima - pozitie_k if pozitie_k <= sectiune_maxima: return sectiune_maxima - pozitie_k # altfel, termenul este pozitie_k - sectiune_maxima + 2 else: return pozitie_k - sectiune_maxima + 2
if __name__ == "__main__":
# citim valoarea lui k k = int(input("Introduceti valoarea lui k: "))
- verificăm dacă valoarea lui k respectă restricțiile impuse
if 1 <= k <= 2000000000:
- calculăm termenul k
termen = k_termen(k) print("Datele de intrare corespund restricțiilor impuse.") print(f"Termenul {k}-lea din sir este: {termen}") else: print("Datele de intrare nu corespund restricțiilor impuse.")
</syntaxhighlight>