2229 - numere20: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Enunt == Ionel are de rezolvat mai multe probleme de divizibilitate. Unele dintre ele îi cer să afle câte numere au anumite proprietăţi. Vă rugăm să-l ajutaţi să termine tema mai repede. == Cerința == Scrieţi un program care citeşte un număr natural n şi două numere prime u şi v mai mici decât 10 şi determină câte numere naturale mai mici sau egale cu n au proprietatea că nu sunt divizibile nici cu u, nici cu v. == Date de intrare == Fișierul de...
 
No edit summary
 
Line 3: Line 3:
Ionel are de rezolvat mai multe probleme de divizibilitate. Unele dintre ele îi cer să afle câte numere au anumite proprietăţi. Vă rugăm să-l ajutaţi să termine tema mai repede.
Ionel are de rezolvat mai multe probleme de divizibilitate. Unele dintre ele îi cer să afle câte numere au anumite proprietăţi. Vă rugăm să-l ajutaţi să termine tema mai repede.


== Cerința ==
= Cerința =
Scrieţi un program care citeşte un număr natural <code>n</code> şi două numere prime <code>u</code> şi <code>v</code> mai mici decât <code>10</code> şi determină câte numere naturale mai mici sau egale cu <code>n</code> au proprietatea că nu sunt divizibile nici cu <code>u</code>, nici cu <code>v</code>.


Scrieţi un program care citeşte un număr natural n şi două numere prime u şi v mai mici decât 10 şi determină câte numere naturale mai mici sau egale cu n au proprietatea că nu sunt divizibile nici cu u, nici cu v.
= Date de intrare =
Fișierul de intrare <code>numere20.in</code> conţine pe prima linie numărul natural <code>n</code> şi cifrele <code>u</code> şi <code>v</code>, separate prin câte un spaţiu.


== Date de intrare ==
= Date de ieșire =
Fișierul de ieșire <code>numere20.out</code> va conţine o singură linie pe care va fi scris numărul de numere naturale mai mici sau egale cu <code>n</code> care nu sunt divizibile nici cu <code>u</code>, nici cu <code>v</code>. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".


Fișierul de intrare numere20.in conţine pe prima linie numărul natural n şi cifrele u şi v, separate prin câte un spaţiu.
= Restricții și precizări =


== Date de ieșire ==
* Numărul natural <code>n</code> are cel mult <code>100</code> de cifre


Fișierul de ieșire numere20.out va conţine o singură linie pe care va fi scris numărul de numere naturale mai mici sau egale cu n care nu sunt divizibile nici cu u, nici cu v.
= Exemplul 1: =
<code>numere20.in</code>
30  3  7
<code>numere20.out</code>
17


== Restricții și precizări ==
=== Explicație ===
Numerele care au proprietatea din enunţ sunt: <code>1</code>, <code>2</code>, <code>4</code>, <code>5</code>, <code>8</code>, <code>10</code>, <code>11</code>, <code>13</code>, <code>16</code>, <code>17</code>, <code>19</code>, <code>20</code>, <code>22</code>, <code>23</code>, <code>25</code>, <code>26</code>, <code>29</code>.


*Numărul natural n are cel mult 100 de cifre
== Exemplul 2: ==
<code>numere20.in</code>
30  3  7
<code>numere20.out</code>
Datele nu corespund restrictiilor impuse


== Exemplul 1 ==
== Rezolvare ==
 
<syntaxhighlight lang="python3">
;numere20in.txt
LG = 1001
 
:30 3 7
 
;numere20in.txt


:Datele introduse corespund restrictiilor impuse.
def Set(a, x):
    n = len(x)
    a[0] = n
    for i in range(1, n + 1):
        a[i] = int(x[n - i])


:17
def copie(A, B):
    A[:LG] = B[:LG]


== Exemplul 2 ==
def scrie(a):
    with open("numere20OUT.txt", "w") as g:
        for i in range(a[0], 0, -1):
            g.write(str(a[i]))
        g.write('\n')


;numere20in.txt
def verifica_restrictii(n, u, v):
    if n[0] > 100 or u > 100 or v > 100:
        with open("numere20OUT.txt", "w") as g:
            g.write("Datele nu corespund restrictiilor impuse\n")
        return False
    return True


:0  
def suma(A, B, C):
    r, s = 0, 0
    C[:LG] = A[:LG]
    if A[0] > B[0]:
        C[0] = A[0]
    else:
        C[0] = B[0]
    i = 1
    while i <= B[0]:
        s = C[i] + B[i] + r
        r = s // 10
        C[i] = s % 10
        i += 1
    while r:
        s = C[i] + r
        r = s // 10
        C[i] = s % 10
        i += 1
    if i - 1 > C[0]:
        C[0] += 1


;numere20out.txt
def dif(A, B, C):
    C[:LG] = A[:LG]
    i = 1
    while i <= C[0]:
        if C[i] >= B[i]:
            C[i] -= B[i]
        else:
            j = i + 1
            while C[j] == 0:
                C[j] = 9
                j += 1
            C[j] -= 1
            C[i] += 10 - B[i]
        i += 1
    i = C[0]
    while i > 1 and C[i] == 0:
        i -= 1
    C[0] = i


:Datele de intrare nu corespund restrictiilor impuse.
def divide_mare_mic(a, b, c):
 
    x, i, j = 0, a[0], 0
== Rezolvare ==
    y = [0] * LG
 
    while x < b and i > 0:
<syntaxhighlight lang="python3" line="1">
        x = x * 10 + a[i]
 
        i -= 1
def numere_fara_divizori(n, u, v):
    x = x // 10
    count = 0
    i += 1
 
    while i > 0:
    for numar in range(1, n + 1):
        x = x * 10 + a[i]
        if numar % u != 0 and numar % v != 0:
        y[j] = x // b
             count += 1
        x = x % b
 
        i -= 1
    return count
        j += 1
    if j == 0:
        c[0] = 1
        c[1] = 0
    else:
        c[0] = j
        for i, k in enumerate(range(j - 1, -1, -1), start=1):
             c[i] = y[k]


def main():
def main():
     n = int(input("Introduceți un număr natural n: "))
     nn, u, v = f.readline().split()
     u = int(input("Introduceți un număr prim u mai mic decât 10: "))
     u, v = int(u), int(v)
     v = int(input("Introduceți un număr prim v mai mic decât 10: "))
     n, nr1, nr2, nr3, nr4, nr5, nr = [0] * LG, [0] * LG, [0] * LG, [0] * LG, [0] * LG, [0] * LG, [0] * LG
    Set(n, nn)


     if u >= 10 or v >= 10 or not (1 < u < 10 and 1 < v < 10):
     if not verifica_restrictii(n, u, v):
        print("Eroare: u și v trebuie să fie numere prime mai mici decât 10.")
         return
         return


     rezultat = numere_fara_divizori(n, u, v)
     divide_mare_mic(n, u, nr1)
     print(f"Câte numere naturale mai mici sau egale cu {n} nu sunt divizibile nici cu {u}, nici cu {v}?
    divide_mare_mic(n, v, nr2)
     suma(nr1, nr2, nr3)
    divide_mare_mic(n, u * v, nr4)
    dif(nr3, nr4, nr5)
    dif(n, nr5, nr)
    scrie(nr)


if __name__ == "__main__":
if __name__ == "__main__":
     main()
     with open("numere20IN.txt", "r") as f:
 
        main()


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 16:08, 12 February 2024

Enunt[edit | edit source]

Ionel are de rezolvat mai multe probleme de divizibilitate. Unele dintre ele îi cer să afle câte numere au anumite proprietăţi. Vă rugăm să-l ajutaţi să termine tema mai repede.

Cerința[edit | edit source]

Scrieţi un program care citeşte un număr natural n şi două numere prime u şi v mai mici decât 10 şi determină câte numere naturale mai mici sau egale cu n au proprietatea că nu sunt divizibile nici cu u, nici cu v.

Date de intrare[edit | edit source]

Fișierul de intrare numere20.in conţine pe prima linie numărul natural n şi cifrele u şi v, separate prin câte un spaţiu.

Date de ieșire[edit | edit source]

Fișierul de ieșire numere20.out va conţine o singură linie pe care va fi scris numărul de numere naturale mai mici sau egale cu n care nu sunt divizibile nici cu u, nici cu v. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".

Restricții și precizări[edit | edit source]

  • Numărul natural n are cel mult 100 de cifre

Exemplul 1:[edit | edit source]

numere20.in

30  3  7

numere20.out

17

Explicație[edit | edit source]

Numerele care au proprietatea din enunţ sunt: 1, 2, 4, 5, 8, 10, 11, 13, 16, 17, 19, 20, 22, 23, 25, 26, 29.

Exemplul 2:[edit | edit source]

numere20.in

30  3  7

numere20.out

Datele nu corespund restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3"> LG = 1001

def Set(a, x):

   n = len(x)
   a[0] = n
   for i in range(1, n + 1):
       a[i] = int(x[n - i])

def copie(A, B):

   A[:LG] = B[:LG]

def scrie(a):

   with open("numere20OUT.txt", "w") as g:
       for i in range(a[0], 0, -1):
           g.write(str(a[i]))
       g.write('\n')

def verifica_restrictii(n, u, v):

   if n[0] > 100 or u > 100 or v > 100:
       with open("numere20OUT.txt", "w") as g:
           g.write("Datele nu corespund restrictiilor impuse\n")
       return False
   return True

def suma(A, B, C):

   r, s = 0, 0
   C[:LG] = A[:LG]
   if A[0] > B[0]:
       C[0] = A[0]
   else:
       C[0] = B[0]
   i = 1
   while i <= B[0]:
       s = C[i] + B[i] + r
       r = s // 10
       C[i] = s % 10
       i += 1
   while r:
       s = C[i] + r
       r = s // 10
       C[i] = s % 10
       i += 1
   if i - 1 > C[0]:
       C[0] += 1

def dif(A, B, C):

   C[:LG] = A[:LG]
   i = 1
   while i <= C[0]:
       if C[i] >= B[i]:
           C[i] -= B[i]
       else:
           j = i + 1
           while C[j] == 0:
               C[j] = 9
               j += 1
           C[j] -= 1
           C[i] += 10 - B[i]
       i += 1
   i = C[0]
   while i > 1 and C[i] == 0:
       i -= 1
   C[0] = i

def divide_mare_mic(a, b, c):

   x, i, j = 0, a[0], 0
   y = [0] * LG
   while x < b and i > 0:
       x = x * 10 + a[i]
       i -= 1
   x = x // 10
   i += 1
   while i > 0:
       x = x * 10 + a[i]
       y[j] = x // b
       x = x % b
       i -= 1
       j += 1
   if j == 0:
       c[0] = 1
       c[1] = 0
   else:
       c[0] = j
       for i, k in enumerate(range(j - 1, -1, -1), start=1):
           c[i] = y[k]

def main():

   nn, u, v = f.readline().split()
   u, v = int(u), int(v)
   n, nr1, nr2, nr3, nr4, nr5, nr = [0] * LG, [0] * LG, [0] * LG, [0] * LG, [0] * LG, [0] * LG, [0] * LG
   Set(n, nn)
   if not verifica_restrictii(n, u, v):
       return
   divide_mare_mic(n, u, nr1)
   divide_mare_mic(n, v, nr2)
   suma(nr1, nr2, nr3)
   divide_mare_mic(n, u * v, nr4)
   dif(nr3, nr4, nr5)
   dif(n, nr5, nr)
   scrie(nr)

if __name__ == "__main__":

   with open("numere20IN.txt", "r") as f:
       main()

</syntaxhighlight>