2213 - Sir Div K: Difference between revisions
Pagină nouă: == Enunț == Cu ajutorul a trei cifre date a, b, c, unde a > 0, se construieşte următorul şir de numere: '''a,ab,abc,abca,abcab,abcabc''',… . De exemplu, pentru '''a=1''', '''b=3''', '''c=7''', putem construi şirul: '''1,13,137, 1371,13713, 137137, 1371371, 13713713, ...''' == Cerinţa == crieţi un program care determină câte numere divizibile cu '''k''' se găsesc în primii '''n''' termeni ai şirului dat. == Date de intrare == Fișierul de intrare '''sirdivk.in'''... |
Diana Butuza (talk | contribs) |
||
Line 62: | Line 62: | ||
== Explicație rezolvare== | == Explicație rezolvare== | ||
Funția de validare primește argumentele a, b, c, n și k și verifică dacă acestea respectă restricțiile impuse. Prin intermediul a trei declarații if verifică dacă n este în intervalul dorit și, dacă nu, va afișa un mesaj corespunzător și va returna False. În mod similar, verifică și dacă k este în intervalul dorit, iar dacă nu este, va afișa un mesaj corespunzător și va returna False. În cele din urmă, verifică dacă a este între 1 și 9, iar dacă b și c sunt între 0 și 9. Dacă acestea nu sunt îndeplinite, va afișa un mesaj corespunzător și va returna False. În caz contrar, returnează True. <br> În blocul principal al programului avem with open("sirdivk.in") as f: - deschide fișierul de intrare sirdivk.in și îl asociază variabilei f. Utilizând blocul with, asigurăm că fișierul este închis automat după ce ieșim din bloc. <br> a, b, c, n, k = map(int, f.readline().split()) - citim o linie din fișierul de intrare, o împărțim în cuvinte folosind metoda split() și convertim fiecare cuvânt într-un număr întreg folosind funcția map(). Apoi, desfacem valorile din tuplul returnat și le atribuim variabilelor corespunzătoare. <br> if not validate_input(a, b, c, n, k): - apelăm funcția validate_input() pentru a verifica dacă datele de intrare respectă restricțiile impuse. Dacă funcția returnează False, afișăm un mesaj corespunzător și ieșim din program. <br> numar = [a, b, c] * (n // 3 + 1) - generăm vectorul numar, care conține cifrele numărului format din primii n termeni ai șirului. Pentru aceasta, repetăm secvența de cifre a, b, c de n // 3 + 1 ori și obținem astfel un vector cu cel puțin n elemente. <br> rest = 0 - inițializăm variabila rest cu 0, care va reprezenta restul obținut în urma împărțirii cifrelor numărului format din primii n termeni ai șirului la k. <br> gasite = 0 - inițializăm numărul de numere div |
Revision as of 12:49, 5 April 2023
Enunț
Cu ajutorul a trei cifre date a, b, c, unde a > 0, se construieşte următorul şir de numere: a,ab,abc,abca,abcab,abcabc,… . De exemplu, pentru a=1, b=3, c=7, putem construi şirul: 1,13,137, 1371,13713, 137137, 1371371, 13713713, ...
Cerinţa
crieţi un program care determină câte numere divizibile cu k se găsesc în primii n termeni ai şirului dat.
Date de intrare
Fișierul de intrare sirdivk.in conține pe prima linie numerele a b c n k.
Date de ieșire
Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe urmatorul rand fișierul de ieșire sirdivk.out conţine o singură linie pe care este scris numărul nr de numere divizibile cu k aflate printre primii n termeni ai şirului dat. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse.".
Restricţii şi precizări
- 1 < n < 1000
- 2 ⩽ k < 32000
- 1 ⩽ a ⩽ 9, 0 ⩽ b,c ⩽ 9
Exemplu
- sirdivk.in
- 7 2 1 8 3
- sirdivk.out
- Datele sunt introduse corect.
- 2
Explicație
Printre primii 8 termeni ai şirului: 7, 72, 721, 7217, 72172, 721721, 7217217, 72172172,... există doi termeni divizibili cu 3.
Rezolvare
<syntaxhighlight lang="python" line> def validate_input(a, b, c, n, k):
if not(1 < n < 1000) or not(2 <= k < 32000) or not(0 <= b <= 9) or not(0 <= c <= 9) or not(1 <= a <= 9): print("Datele nu corespund restricțiilor impuse.") return False else: print("Datele sunt introduse corect.") return True
if __name__ == '__main__':
a, b, c, n, k = map(int, input().split())
if not validate_input(a, b, c, n, k): exit()
numar = [a] * n for i in range(1, n): if i % 3 == 1: numar[i] = b elif i % 3 == 2: numar[i] = c
rest = 0 gasite = 0 for i in range(n): rest = rest * 10 + numar[i] if rest % k == 0: gasite += 1 rest %= k
print(gasite)
</syntaxhighlight>
Explicație rezolvare
Funția de validare primește argumentele a, b, c, n și k și verifică dacă acestea respectă restricțiile impuse. Prin intermediul a trei declarații if verifică dacă n este în intervalul dorit și, dacă nu, va afișa un mesaj corespunzător și va returna False. În mod similar, verifică și dacă k este în intervalul dorit, iar dacă nu este, va afișa un mesaj corespunzător și va returna False. În cele din urmă, verifică dacă a este între 1 și 9, iar dacă b și c sunt între 0 și 9. Dacă acestea nu sunt îndeplinite, va afișa un mesaj corespunzător și va returna False. În caz contrar, returnează True.
În blocul principal al programului avem with open("sirdivk.in") as f: - deschide fișierul de intrare sirdivk.in și îl asociază variabilei f. Utilizând blocul with, asigurăm că fișierul este închis automat după ce ieșim din bloc.
a, b, c, n, k = map(int, f.readline().split()) - citim o linie din fișierul de intrare, o împărțim în cuvinte folosind metoda split() și convertim fiecare cuvânt într-un număr întreg folosind funcția map(). Apoi, desfacem valorile din tuplul returnat și le atribuim variabilelor corespunzătoare.
if not validate_input(a, b, c, n, k): - apelăm funcția validate_input() pentru a verifica dacă datele de intrare respectă restricțiile impuse. Dacă funcția returnează False, afișăm un mesaj corespunzător și ieșim din program.
numar = [a, b, c] * (n // 3 + 1) - generăm vectorul numar, care conține cifrele numărului format din primii n termeni ai șirului. Pentru aceasta, repetăm secvența de cifre a, b, c de n // 3 + 1 ori și obținem astfel un vector cu cel puțin n elemente.
rest = 0 - inițializăm variabila rest cu 0, care va reprezenta restul obținut în urma împărțirii cifrelor numărului format din primii n termeni ai șirului la k.
gasite = 0 - inițializăm numărul de numere div