0960 - Termen k in sir

From Bitnami MediaWiki
Revision as of 21:21, 23 April 2023 by Adina Timiș (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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">

  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: "))
  1. verificăm dacă valoarea lui k respectă restricțiile impuse
   if 1 <= k <= 2000000000:
  1. 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>