1440 - Numar termeni sir cu prima cifra k

De la Universitas 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 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

#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()

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 .