1440 - Numar termeni sir cu prima cifra k

From Bitnami MediaWiki

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>

  1. 1440 - Numar termeni sir cu prima cifra k

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)
  1. Citire date de intrare

k, n, x = map(int, input().split())

  1. Verificare restricții

if not validate_constraints(k, n, x):

   exit()
  1. Generare șir

sequence = generate_sequence()

  1. Calculul rezultatelor

result_a = count_first_digit_k(sequence, k) result_b = find_nth_term(sequence, n) result_c = find_largest_term(sequence, x)

  1. 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.