2213 - Sir Div K: Difference between revisions

From Bitnami MediaWiki
No edit summary
 
(4 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==
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

Latest revision as of 19:43, 9 April 2023

Enunț[edit]

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]

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]

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

Date de ieșire[edit]

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]

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

Exemplu[edit]

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

Explicație[edit]

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

Rezolvare[edit]

<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>