2229 - numere20: Difference between revisions
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 = | |||
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>. | |||
= 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 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". | |||
= Restricții și precizări = | |||
* Numărul natural <code>n</code> are cel mult <code>100</code> de cifre | |||
= Exemplul 1: = | |||
<code>numere20.in</code> | |||
30 3 7 | |||
<code>numere20.out</code> | |||
17 | |||
== | === 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>. | |||
== Exemplul 2: == | |||
<code>numere20.in</code> | |||
30 3 7 | |||
<code>numere20.out</code> | |||
Datele nu corespund restrictiilor impuse | |||
== | == Rezolvare == | ||
<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 | |||
: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 | |||
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(): | def main(): | ||
nn, u, v = f.readline().split() | |||
u = int( | 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 | if not verifica_restrictii(n, u, v): | ||
return | 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__": | if __name__ == "__main__": | ||
main() | with open("numere20IN.txt", "r") as f: | ||
main() | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Latest revision as of 16:08, 12 February 2024
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 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
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
- Numărul natural
nare cel mult100de cifre
Exemplul 1:
numere20.in
30 3 7
numere20.out
17
Explicație
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:
numere20.in
30 3 7
numere20.out
Datele nu corespund restrictiilor impuse
Rezolvare
<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>