1440 - Numar termeni sir cu prima cifra k
Cerința
Se generează un şir de numere naturale ai cărui primi termeni sunt, în această ordine: 1, 20, 21, 300, 301, 320, 321, 4000, 4001, 4020, 4021, 4300, 4301, 4320, 4321, 50000,... Deduceţi regula după care sunt generaţi termenii şirului şi scrieţi un program care să citească numerele naturale k, n şi x şi care să determine:
- a) numărul de termeni ai şirului care au prima cifră (cea mai semnificativă) egală cu k;
- b) cel de-al n-lea termen al şirului din enunţ;
- c) cel mai mare termen al şirului, mai mic sau egal decât x.
Date de intrare
Fișierul de intrare nr.in conține o singură linie pe care sunt scrise trei numere naturale k, n şi x, separate prin câte un spaţiu.
Date de ieșire
Fişierul de ieşire nr.out va conţine 3 linii:
- – pe prima linie se va scrie un număr natural reprezentând numărul de termeni ai şirului care au prima cifră (cea mai semnificativă) egală cu k;
- – pe a doua linie se va scrie un număr natural reprezentând cel de-al n-lea termen al şirului din enunţ;
- – pe a treia linie se va scrie un număr natural reprezentând cel mai mare termen al şirului, mai mic sau egal cu x.
Restricții și precizări
- 1 ⩽ k ⩽ 9
- 3 ⩽ n ⩽ 511
- 1 ⩽ x ⩽ 2.000.000.000
Exemplu 1
- nr.in
4 19 57890
- nr.out
8
50021
54321
Exemplu 2
- nr.in
- 0 1 0
- nr.out
- Nu au fost respectate cerintele impuse.
Rezolvare
<syntaxhighlight lang="python" line> def validate_constraints(k, n, x):
if not (1 <= k <= 9 and 3 <= n <= 511 and 1 <= x <= 2000000000): print("Nu au fost respectate cerintele impuse.") return False return True
def generate_sequence():
sequence = [1] current = 1 while current <= 2000000000: sequence.append(current * 10) for i in range(1, 10): term = current * 10 + i if term <= 2000000000: sequence.append(term) current *= 10 return sequence
def count_first_digit_k(sequence, k):
return sum(1 for term in sequence if str(term)[0] == str(k))
def find_nth_term(sequence, n):
return sequence[n - 1]
def find_largest_term(sequence, x):
valid_terms = [term for term in sequence if term <= x] return max(valid_terms)
- Citire date de intrare
k, n, x = map(int, input().split())
- Verificare restricții
if not validate_constraints(k, n, x):
exit()
- Generare șir
sequence = generate_sequence()
- Calculul rezultatelor
result_a = count_first_digit_k(sequence, k) result_b = find_nth_term(sequence, n) result_c = find_largest_term(sequence, x)
- Afisarea rezultatelor în fișierul nr.out
with open("nr.out", "w") as file_out:
file_out.write(str(result_a) + "\n") file_out.write(str(result_b) + "\n") file_out.write(str(result_c) + "\n")
</syntaxhighlight>
Explicatie
Pe prima linie a fişierului nr.out se scrie numărul 8, deoarece sunt 8 termeni în şir care au prima cifră egală cu k=4). Pe a doua linie a fişierului se scrie numărul 50021, deoarece cel de-al n-lea (n=19) termen al şirului este 50021. Numerele 54321 şi 600000 sunt doi termeni situaţi pe poziţii consecutive în şirul din enunţ, iar 54321 ≤ 57890 < 600000. Astfel, numărul 54321 se scrie pe ultima linie a fişierului nr.out.