2213 - Sir Div K: Difference between revisions

From Bitnami MediaWiki
No edit summary
 
(2 intermediate revisions by 2 users not shown)
Line 5: Line 5:
'''1,13,137, 1371,13713, 137137, 1371371, 13713713, ...'''
'''1,13,137, 1371,13713, 137137, 1371371, 13713713, ...'''
== Cerinţa ==
== Cerinţa ==
crieţi un program care determină câte numere divizibile cu '''k''' se găsesc în primii '''n''' termeni ai şirului dat.
Scrieţi un program care determină câte numere divizibile cu '''k''' se găsesc în primii '''n''' termeni ai şirului dat.
 
== Date de intrare ==
== Date de intrare ==
Fișierul de intrare '''sirdivk.in''' conține pe prima linie numerele '''a b c n k'''.
Fișierul de intrare '''sirdivk.in''' conține pe prima linie numerele '''a b c n k'''.
Line 28: Line 29:
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
def validare_date(a, b, c, n, k):
def validare_date(a, b, c, n, k):
    # Verificăm dacă toate valorile de intrare respectă restricțiile
     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):
     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
         return False
Line 34: Line 36:


if __name__ == '__main__':
if __name__ == '__main__':
     with open("sirdivk.out", "w") as f_out:
    # Deschidem fișierul de intrare și citim valorile de intrare
         a, b, c, n, k = map(int, input().split())
     with open("sirdivk.in", "r") as f_in:
         a, b, c, n, k = map(int, f_in.readline().split())


        if not validate_date(a, b, c, n, k):
    # Verificăm dacă valorile de intrare sunt valide
    if not validare_date(a, b, c, n, k):
        # Scriem un mesaj de eroare în fișierul de ieșire și ieșim din program
        with open("sirdivk.out", "w") as f_out:
             f_out.write("Datele nu corespund restricțiilor impuse.")
             f_out.write("Datele nu corespund restricțiilor impuse.")
            exit()
        exit()
        else:
    else:
            f_out.write("Datele sunt introduse corect.")
        # Secvența de operații pe care o vom efectua dacă valorile de intrare sunt valide
 
         numar = [a] * n
         numar = [a] * n
         for i in range(1, n):
         for i in range(1, n):
Line 58: Line 63:
             rest %= k
             rest %= k


         f_out.write(str(gasite))
         # Scriem rezultatul în fișierul de ieșire
 
        with open("sirdivk.out", "w") as f_out:
            f_out.write("Datele sunt introduse corect.\n")
            f_out.write(str(gasite))


</syntaxhighlight>
</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.".<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.

Latest revision as of 19:43, 9 April 2023

Enunț[edit | edit source]

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[edit | edit source]

Scrieţi un program care determină câte numere divizibile cu k se găsesc în primii n termeni ai şirului dat.

Date de intrare[edit | edit source]

Fișierul de intrare sirdivk.in conține pe prima linie numerele a b c n k.

Date de ieșire[edit | edit source]

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[edit | edit source]

  • 1 < n < 1000
  • 2 ⩽ k < 32000
  • 1 ⩽ a ⩽ 9, 0 ⩽ b,c ⩽ 9

Exemplu[edit | edit source]

sirdivk.in
7 2 1 8 3
sirdivk.out
Datele sunt introduse corect.
2

Explicație[edit | edit source]

Printre primii 8 termeni ai şirului: 7, 72, 721, 7217, 72172, 721721, 7217217, 72172172,... există doi termeni divizibili cu 3.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def validare_date(a, b, c, n, k):

   # Verificăm dacă toate valorile de intrare respectă restricțiile
   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__':

   # Deschidem fișierul de intrare și citim valorile de intrare
   with open("sirdivk.in", "r") as f_in:
       a, b, c, n, k = map(int, f_in.readline().split())
   # Verificăm dacă valorile de intrare sunt valide
   if not validare_date(a, b, c, n, k):
       # Scriem un mesaj de eroare în fișierul de ieșire și ieșim din program
       with open("sirdivk.out", "w") as f_out:
           f_out.write("Datele nu corespund restricțiilor impuse.")
       exit()
   else:
       # Secvența de operații pe care o vom efectua dacă valorile de intrare sunt valide
       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
       # Scriem rezultatul în fișierul de ieșire
       with open("sirdivk.out", "w") as f_out:
           f_out.write("Datele sunt introduse corect.\n")
           f_out.write(str(gasite))

</syntaxhighlight>