3381 - K Sir 1: Difference between revisions

From Bitnami MediaWiki
Paul Ungur (talk | contribs)
No edit summary
Paul Ungur (talk | contribs)
No edit summary
 
Line 10: Line 10:


==Date de ieșire==
==Date de ieșire==
Fișierul de ieșire <span style=“color: red”>ksir.out</span> va conţine o singură linie pe care va fi scris un număr natural ce reprezintă al <span style=“color: red”>k</span>-lea element din şir.
Dacă datele sunt introduse corect, pe ecran se va afișa: '''"Date de intrare valide."''', apoi fișierul de ieșire <span style=“color: red”>ksir.out</span> va conţine o singură linie pe care va fi scris un număr natural ce reprezintă al <span style=“color: red”>k</span>-lea element din şir. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: '''"Date de intrare invalide"'''.


==Restricții și precizări==
==Restricții și precizări==
Line 18: Line 18:
==Exemplu:==
==Exemplu:==
<span style=“color: red”>ksir.in</span>
<span style=“color: red”>ksir.in</span>
8
: 8


: Date de intrare valide
ksir.out
ksir.out
3
: 3


==Explicație==
==Explicație==

Latest revision as of 19:00, 29 June 2023

Se dă următorul şir de numere: 1 1 2 2 1 2 3 3 3 1 2 3 4 4 4 4 1 2 3 4 5 5 5 5 5... În şir avem grupe formate după următoarea regulă: grupa g conţine numerele naturale de la 1 la g în ordine crescătoare, urmate de g-1 valori egale cu g (g=1, 2, ...).

Cerința

Scrieţi un program care citeşte o valoare k şi afişează al k-lea termen al şirului de mai sus.

Date de intrare

Fișierul de intrare ksir.in conţine pe prima linie numărul natural k.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Date de intrare valide.", apoi fișierul de ieșire ksir.out va conţine o singură linie pe care va fi scris un număr natural ce reprezintă al k-lea element din şir. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: "Date de intrare invalide".

Restricții și precizări

1 ≤ k ≤ 20.000.000.000 Poziţiile termenilor din şir sunt numerotate începând cu 1.

Exemplu:

ksir.in

8
Date de intrare valide

ksir.out

3

Explicație

Al 8-lea element din şir este 3.

Rezolvare

<syntaxhighlight lang="python" line> def validare(k):

   if not isinstance(k, int):
       raise ValueError("k trebuie sa fie un numar intreg")
   if k < 1 or k > 20000000000:
       raise ValueError("k trebuie sa fie intre 1 si 20.000.000.000")
   return True


def k_sir(k):

   n, cnt = 1, 1
   while (1 * (n + 1) * (n + 1) // 4 < k):
       n += 2
       cnt += 1
   n -= 2
   k -= 1 * (n + 1) * (n + 1) // 4
   nr = 0
   while k:
       if nr != cnt:
           nr += 1
       k -= 1
   fout.write(str(nr))
   fin.close()
   fout.close()


if __name__ == "__main__":

   fin = open("ksir.in")
   fout = open("ksir.out", "w")
   k = int(fin.readline().strip())
   if validare(k):
       print("Date de intrare valide")
       k_sir(k)
   else:
       print("Date de intrare invalide")

</syntaxhighlight>

Explicatie cod:

Funcția validare(k) primește un număr întreg k și verifică dacă acesta este un întreg și se încadrează în intervalul [1, 20.000.000.000]. Dacă k nu respectă aceste condiții, funcția aruncă o excepție de tip ValueError cu un mesaj corespunzător. În caz contrar, returnează True. Funcția k_sir(k) primește un număr întreg k și efectuează un set de operații. Folosind o buclă while, se calculează valorile n și cnt până când expresia 1 * (n + 1) * (n + 1) // 4 < k devine falsă. Apoi, se ajustează valorile n și k în funcție de formula specificată. Se parcurge o buclă while în care se scade valoarea k până când acesta devine zero, în timp ce nr este incrementat cu 1 în fiecare iterație. La final, se scrie rezultatul în fișierul de ieșire. În blocul if __name__ == "__main__":, se deschid fișierele de intrare și de ieșire (ksir.in și ksir.out). Se citește prima linie din fișierul de intrare pentru a obține valoarea k. Apoi, se verifică dacă datele de intrare sunt valide utilizând funcția validare(k). Dacă datele sunt valide, se afișează un mesaj de confirmare, se apelează funcția k_sir() și se efectuează operațiile corespunzătoare. În final, se închid fișierele de intrare și de ieșire.