1440 - Numar termeni sir cu prima cifra k: Difference between revisions

From Bitnami MediaWiki
No edit summary
 
Line 1: Line 1:
== Cerința ==
== Cerința ==
Se generează un şir de numere naturale ai cărui primi termeni sunt, în această ordine:
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,...
'''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:
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;
: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ţ;
: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.
:c) cel mai mare termen al şirului, mai mic sau egal decât '''x'''.
== Date de intrare ==
== 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.
Fișierul de intrare '''nrin.txt''' 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 ==
== Date de ieșire ==
Fişierul de ieşire nrout.txt va conţine 3 linii:
Fişierul de ieşire '''nrout.txt''' 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 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 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.
:– 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 ==
== Restricții și precizări ==
* 1 ⩽ k ⩽ 9
* '''1 ⩽ k ⩽ 9'''
* 3 ⩽ n ⩽ 511
* '''3 ⩽ n ⩽ 511'''
* 1 ⩽ x ⩽ 2.000.000.000
* '''1 ⩽ x ⩽ 2.000.000.000'''
== Exemplu 1 ==
== Exemplu 1 ==
; nrin.txt
; '''nrin.txt'''
4 19 57890
:4 19 57890
; nrout.txt
; '''nrout.txt'''
8
:8
50021
:50021
54321
:54321
<br>
<br>
== Exemplu 2 ==
== Exemplu 2 ==
; nrin.txt
; '''nrin.txt'''
: 0 1 0
: 0 1 0
; nrout.txt
; '''nrout.txt'''
: Nu au fost respectate cerintele impuse.
: Nu au fost respectate cerintele impuse.
<br>
<br>
Line 36: Line 35:
== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
#1440 - Numar termeni sir cu prima cifra k
#1440 - Nr
def validate_constraints(k, n, x):
def count_terms_with_first_digit_k(k, x):
     if not (1 <= k <= 9 and 3 <= n <= 511 and 1 <= x <= 2000000000):
     count = 0
         print("Nu au fost respectate cerintele impuse.")
    current_term = 1
        return False
 
     return True
    while current_term <= x:
        if str(current_term)[0] == str(k):
            count += 1
        current_term *= 10
 
    return count
 
def find_nth_term(n):
    terms = [1]
    current_term = 1
 
    while len(terms) < n:
        current_term += 1
         terms.append(current_term)
 
     return terms[-1]


def generate_sequence():
def find_largest_term_less_than_x(x):
     sequence = [1]
     current_term = 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):
    while current_term <= x:
    return sum(1 for term in sequence if str(term)[0] == str(k))
        current_term *= 10


def find_nth_term(sequence, n):
     return current_term // 10
     return sequence[n - 1]


def find_largest_term(sequence, x):
def main():
    valid_terms = [term for term in sequence if term <= x]
    try:
    return max(valid_terms)
        with open('nrin.txt', 'r') as file:
            k, n, x = map(int, file.readline().split())


# Citire date de intrare
        if not (1 <= k <= 9 and 3 <= n <= 511 and 1 <= x <= 2000000000):
k, n, x = map(int, input().split())
            raise ValueError("Nu au fost respectate cerintele impuse.")


# Verificare restricții
        result1 = count_terms_with_first_digit_k(k, x)
if not validate_constraints(k, n, x):
        result2 = find_nth_term(n)
    exit()
        result3 = find_largest_term_less_than_x(x)


# Generare șir
        with open('nrout.txt', 'w') as file_out:
sequence = generate_sequence()
            file_out.write(str(result1) + '\n')
            file_out.write(str(result2) + '\n')
            file_out.write(str(result3) + '\n')


# Calculul rezultatelor
    except ValueError as e:
result_a = count_first_digit_k(sequence, k)
        with open('nrout.txt', 'w') as file_out:
result_b = find_nth_term(sequence, n)
            file_out.write(str(e) + '\n')
result_c = find_largest_term(sequence, x)


# Afisarea rezultatelor în fișierul nrout.txt
if __name__ == "__main__":
with open("nrout.txt", "w") as file_out:
     main()
     file_out.write(str(result_a) + "\n")
    file_out.write(str(result_b) + "\n")
    file_out.write(str(result_c) + "\n")


</syntaxhighlight>
</syntaxhighlight>


== Explicatie ==
== 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 prima linie a fişierului nrout.txt 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.
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.
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 nrout.txt .

Latest revision as of 11:15, 5 January 2024

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 nrin.txt 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 nrout.txt 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

nrin.txt
4 19 57890
nrout.txt
8
50021
54321


Exemplu 2

nrin.txt
0 1 0
nrout.txt
Nu au fost respectate cerintele impuse.


Rezolvare

<syntaxhighlight lang="python" line>

  1. 1440 - Nr

def count_terms_with_first_digit_k(k, x):

   count = 0
   current_term = 1
   while current_term <= x:
       if str(current_term)[0] == str(k):
           count += 1
       current_term *= 10
   return count

def find_nth_term(n):

   terms = [1]
   current_term = 1
   while len(terms) < n:
       current_term += 1
       terms.append(current_term)
   return terms[-1]

def find_largest_term_less_than_x(x):

   current_term = 1
   while current_term <= x:
       current_term *= 10
   return current_term // 10

def main():

   try:
       with open('nrin.txt', 'r') as file:
           k, n, x = map(int, file.readline().split())
       if not (1 <= k <= 9 and 3 <= n <= 511 and 1 <= x <= 2000000000):
           raise ValueError("Nu au fost respectate cerintele impuse.")
       result1 = count_terms_with_first_digit_k(k, x)
       result2 = find_nth_term(n)
       result3 = find_largest_term_less_than_x(x)
       with open('nrout.txt', 'w') as file_out:
           file_out.write(str(result1) + '\n')
           file_out.write(str(result2) + '\n')
           file_out.write(str(result3) + '\n')
   except ValueError as e:
       with open('nrout.txt', 'w') as file_out:
           file_out.write(str(e) + '\n')

if __name__ == "__main__":

   main()

</syntaxhighlight>

Explicatie

Pe prima linie a fişierului nrout.txt 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 nrout.txt .