0960 - Termen k in sir: Difference between revisions
Adina Timiș (talk | contribs) Pagină nouă: ==Cerința== 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.... |
Adina Timiș (talk | contribs) |
||
Line 23: | Line 23: | ||
#0960 - Termen k in sir | #0960 - Termen k in sir | ||
def k_termen(k): | def k_termen(k): | ||
# inițializăm variabilele pentru calcularea termenului k | |||
lungime_sectiune = 1 | lungime_sectiune = 1 | ||
sectiune_inceput = 1 | sectiune_inceput = 1 | ||
sectiune_maxima = 1 | sectiune_maxima = 1 | ||
# iterăm până când găsim secțiunea în care se află k | |||
while k > lungime_sectiune: | while k > lungime_sectiune: | ||
# scădem din k lungimea secțiunii curente | |||
k -= lungime_sectiune | k -= lungime_sectiune | ||
# actualizăm lungimea și începutul secțiunii | |||
lungime_sectiune += 2 | lungime_sectiune += 2 | ||
sectiune_inceput += lungime_sectiune // 2 | sectiune_inceput += lungime_sectiune // 2 | ||
# actualizăm numărul maxim de secțiuni | |||
sectiune_maxima += 1 | sectiune_maxima += 1 | ||
# calculăm poziția lui k, în secțiunea curentă | |||
pozitie_k = k - 1 | 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: | if pozitie_k <= sectiune_maxima: | ||
return sectiune_maxima - pozitie_k | return sectiune_maxima - pozitie_k | ||
# altfel, termenul este pozitie_k - sectiune_maxima + 2 | |||
else: | else: | ||
return pozitie_k - sectiune_maxima + 2 | return pozitie_k - sectiune_maxima + 2 | ||
def main(): | def main(): | ||
# citim valoarea lui k | |||
k = int(input("Introduceti valoarea lui k: ")) | k = int(input("Introduceti valoarea lui k: ")) | ||
# verificăm dacă valoarea lui k respectă restricțiile impuse | |||
if 1 <= k <= 2000000000: | if 1 <= k <= 2000000000: | ||
# calculăm termenul k | |||
termen = k_termen(k) | termen = k_termen(k) | ||
print("Datele de intrare corespund restricțiilor impuse.") | print("Datele de intrare corespund restricțiilor impuse.") |
Revision as of 20:29, 5 April 2023
Cerința
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
Programul citește de la tastatură numărul natural nenul k.
Date de ieșire
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
- 1 ≤ K ≤ 2000000000, număr natural
- termenii șirului sunt numere naturale nenule strict mai mici decât 30000
Exemplul 1
- Intrare
- 20
- Ieșire
- 2
Exemplul 2
- Intrare
- 0
- Ieșire
- Datele de intrare nu corespund restricțiilor impuse.
Rezolvare
<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
def 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.")
if __name__ == "__main__":
main()
</syntaxhighlight>