2213 - Sir Div K: Difference between revisions

From Bitnami MediaWiki
Line 64: Line 64:


== 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
Acest program primește ca input cinci numere întregi: a, b, c, n și k. Programul verifică dacă aceste valori corespund restricțiilor impuse prin intermediul funcției "validare_date". Dacă valorile nu respectă aceste restricții, programul va scrie în fișierul de ieșire mesajul "Datele nu corespund restricțiilor impuse." și se va opri. În caz contrar, programul va scrie în fișierul de ieșire mesajul "Datele sunt introduse corect.".<br>În continuare, programul va crea un număr de n cifre, unde n este valoarea citită inițial, având cifra a ca valoare inițială pentru toate cifrele. Acest număr este creat prin intermediul unei liste "numar". În timp ce se crează numărul, pentru fiecare cifră care urmează după prima cifră (poziția 1 în listă), programul va verifica dacă poziția este multiplu de 3. Dacă da, va înlocui valoarea cifrei de la acea poziție cu cifra b, altfel va înlocui cu cifra c.După crearea numărului, programul va parcurge toate cifrele acestuia, de la prima la ultima, și va verifica dacă numărul format din cifrele de la poziția 0 până la poziția curentă este divizibil cu k. Dacă este, programul va incrementa o variabilă numită "gasite". La final, programul va scrie în fișierul de ieșire valoarea variabilei "gasite", adică numărul de subșiruri care sunt divizibile cu k

Revision as of 12:37, 9 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 validare_date(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):
       return False
   else:
       return True

if __name__ == '__main__':

   with open("sirdivk.out", "w") as f_out:
       a, b, c, n, k = map(int, input().split())
       if not validate_date(a, b, c, n, k):
           f_out.write("Datele nu corespund restricțiilor impuse.")
           exit()
       else:
           f_out.write("Datele sunt introduse corect.")
       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
       f_out.write(str(gasite))


</syntaxhighlight>

Explicație rezolvare

Acest program primește ca input cinci numere întregi: a, b, c, n și k. Programul verifică dacă aceste valori corespund restricțiilor impuse prin intermediul funcției "validare_date". Dacă valorile nu respectă aceste restricții, programul va scrie în fișierul de ieșire mesajul "Datele nu corespund restricțiilor impuse." și se va opri. În caz contrar, programul va scrie în fișierul de ieșire mesajul "Datele sunt introduse corect.".
În continuare, programul va crea un număr de n cifre, unde n este valoarea citită inițial, având cifra a ca valoare inițială pentru toate cifrele. Acest număr este creat prin intermediul unei liste "numar". În timp ce se crează numărul, pentru fiecare cifră care urmează după prima cifră (poziția 1 în listă), programul va verifica dacă poziția este multiplu de 3. Dacă da, va înlocui valoarea cifrei de la acea poziție cu cifra b, altfel va înlocui cu cifra c.După crearea numărului, programul va parcurge toate cifrele acestuia, de la prima la ultima, și va verifica dacă numărul format din cifrele de la poziția 0 până la poziția curentă este divizibil cu k. Dacă este, programul va incrementa o variabilă numită "gasite". La final, programul va scrie în fișierul de ieșire valoarea variabilei "gasite", adică numărul de subșiruri care sunt divizibile cu k