1440 - Numar termeni sir cu prima cifra k: Difference between revisions
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 | 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 - | #1440 - Nr | ||
def | def count_terms_with_first_digit_k(k, x): | ||
if | count = 0 | ||
current_term = 1 | |||
return | 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 | def find_largest_term_less_than_x(x): | ||
current_term = 1 | |||
while current_term <= x: | |||
current_term *= 10 | |||
return current_term // 10 | |||
return | |||
def | 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): | |||
k | 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> | </syntaxhighlight> | ||
== Explicatie == | == Explicatie == | ||
Pe prima linie a fişierului | 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 | 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>
- 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 .