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