2950 - Adun: Difference between revisions
Sinn Erich (talk | contribs) |
Sinn Erich (talk | contribs) |
||
(12 intermediate revisions by the same user not shown) | |||
Line 3: | Line 3: | ||
Ionel a primit la ora de matematica o problema interesantă. El are doua numere naturale '''X''' și '''Y''' și trebuie să determine un număr natural '''K''' astfel încât cel mai mic multiplu comun al numerelor '''X + K''' și '''Y + K''' să fie minim | Ionel a primit la ora de matematica o problema interesantă. El are doua numere naturale '''X''' și '''Y''' și trebuie să determine un număr natural '''K''' astfel încât cel mai mic multiplu comun al numerelor '''X + K''' și '''Y + K''' să fie minim | ||
Determinați valoarea lui '''K''' astfel încât cel mai mic multiplu comun al numerelor '''X + K''' și '''Y + K''' să fie minim. | |||
== Date de intrare == | == Date de intrare == | ||
Programul citește de la tastatură | Programul citește de la tastatură numerele naturale '''X și Y''' separate cu un spațiu. | ||
== Date de ieșire == | == Date de ieșire == | ||
Programul va afișa pe ecran | Programul va afișa pe ecran valoarea '''K'''. | ||
Dacă datele sunt introduse corect, | Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou afișează valoarea lui K astfel încât cel mai mic multiplu comun al numerelor X + K și Y + K să fie minim. | ||
În | În caz contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse." | ||
== Restricţii şi precizări == | == Restricţii şi precizări == | ||
'''X și Y''' sunt numere naturale mai mici decât 1.000.000.001. | |||
Dacă sunt mai multe valori K pentru care cel mai mic multiplu comun al numerelor '''X + K și Y + K''' este minim, se va afișa valoarea '''K minimă'''. | |||
== Exemplul 1 == | == Exemplul 1 == | ||
; | ; Datele de intrare | ||
: | : Introduceti cele doua numere: | ||
; | : 6 14 | ||
: Datele | ; Datele de ieșire | ||
: | : Datele sunt introduse corect. | ||
: 2 | |||
<br> | <br> | ||
== Rezolvare == | |||
<syntaxhighlight lang="python" line> | |||
#2950 | |||
def validate_input(x, y): | |||
if x < 1 or x >= 1000000001: | |||
return False | |||
if y < 1 or y >= 1000000001: | |||
return False | |||
return True | |||
def gcd(a, b): | |||
while b: | |||
a, b = b, a % b | |||
def | return a | ||
while | |||
return | |||
def solve(x, y): | |||
gcd_xy = gcd(x, y) | |||
lcm_xy = x * y // gcd_xy | |||
# iteram prin toate numerele intre 1 si gcd(X, Y) | |||
min_lcm = lcm_xy | |||
min_k = 0 | |||
for k in range(1, gcd_xy + 1): | |||
lcm_k = (x + k) * (y + k) // gcd(x + k, y + k) | |||
if lcm_k < min_lcm: | |||
min_lcm = lcm_k | |||
min_k = k | |||
# afisam valoarea lui K | |||
print(min_k) | |||
if __name__ == '__main__': | if __name__ == '__main__': | ||
x, y = map(int, input("Introduceti cele doua numere:").split()) | |||
if not | |||
print("Datele | if not validate_input(x, y): | ||
print("Datele nu corespund restricțiilor impuse.") | |||
else: | else: | ||
print("Datele sunt introduse corect.") | |||
solve(x, y) | |||
print("Datele introduse | |||
</syntaxhighlight> | |||
'''Explicatie cod:''' | |||
Această implementare calculează cel mai mic multiplu comun al două numere naturale x și y, în care sunt adăugate valori constante diferite k la fiecare număr și se determină valoarea minimă a lui k astfel încât LCM(x+k, y+k) să fie minim. | |||
Funcția `validate_input(x, y)` verifică dacă cele două numere introduse sunt numere naturale și se încadrează în intervalul [1, 1000000000]. Dacă una dintre condiții nu este îndeplinită, funcția returnează `False`. | |||
Funcția `gcd(a, b)` calculează cel mai mare divizor comun al două numere a și b folosind algoritmul lui Euclid. | |||
Funcția `solve(x, y)` calculează cel mai mic multiplu comun al lui x și y folosind gcd și apoi calculează pentru fiecare valoare k între 1 și gcd(x, y) valoarea LCM(x+k, y+k) și determină valoarea minimă a lui k astfel încât LCM(x+k, y+k) să fie minim. Valoarea minimă a lui k și LCM(x+k, y+k) sunt stocate în variabilele `min_k` și `min_lcm`. La sfârșit, funcția afișează valoarea lui `min_k`. | |||
În `main()`, se citește cele două numere de la tastatură folosind `map()` și apoi se verifică dacă datele de intrare sunt corecte folosind funcția `validate_input(x, y)`. Dacă datele de intrare sunt incorecte, se afișează un mesaj corespunzător. În caz contrar, se afișează un mesaj de confirmare și se apelează funcția `solve(x, y)`. |
Latest revision as of 09:03, 29 April 2023
Sursa: [1]
Cerinţa[edit | edit source]
Ionel a primit la ora de matematica o problema interesantă. El are doua numere naturale X și Y și trebuie să determine un număr natural K astfel încât cel mai mic multiplu comun al numerelor X + K și Y + K să fie minim
Determinați valoarea lui K astfel încât cel mai mic multiplu comun al numerelor X + K și Y + K să fie minim.
Date de intrare[edit | edit source]
Programul citește de la tastatură numerele naturale X și Y separate cu un spațiu.
Date de ieșire[edit | edit source]
Programul va afișa pe ecran valoarea K.
Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou afișează valoarea lui K astfel încât cel mai mic multiplu comun al numerelor X + K și Y + K să fie minim.
În caz contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse."
Restricţii şi precizări[edit | edit source]
X și Y sunt numere naturale mai mici decât 1.000.000.001.
Dacă sunt mai multe valori K pentru care cel mai mic multiplu comun al numerelor X + K și Y + K este minim, se va afișa valoarea K minimă.
Exemplul 1[edit | edit source]
- Datele de intrare
- Introduceti cele doua numere:
- 6 14
- Datele de ieșire
- Datele sunt introduse corect.
- 2
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line>
- 2950
def validate_input(x, y):
if x < 1 or x >= 1000000001: return False if y < 1 or y >= 1000000001: return False return True
def gcd(a, b):
while b: a, b = b, a % b return a
def solve(x, y):
gcd_xy = gcd(x, y) lcm_xy = x * y // gcd_xy
# iteram prin toate numerele intre 1 si gcd(X, Y) min_lcm = lcm_xy min_k = 0
for k in range(1, gcd_xy + 1): lcm_k = (x + k) * (y + k) // gcd(x + k, y + k) if lcm_k < min_lcm: min_lcm = lcm_k min_k = k
# afisam valoarea lui K print(min_k)
if __name__ == '__main__':
x, y = map(int, input("Introduceti cele doua numere:").split())
if not validate_input(x, y): print("Datele nu corespund restricțiilor impuse.") else: print("Datele sunt introduse corect.") solve(x, y)
</syntaxhighlight>
Explicatie cod:
Această implementare calculează cel mai mic multiplu comun al două numere naturale x și y, în care sunt adăugate valori constante diferite k la fiecare număr și se determină valoarea minimă a lui k astfel încât LCM(x+k, y+k) să fie minim.
Funcția `validate_input(x, y)` verifică dacă cele două numere introduse sunt numere naturale și se încadrează în intervalul [1, 1000000000]. Dacă una dintre condiții nu este îndeplinită, funcția returnează `False`.
Funcția `gcd(a, b)` calculează cel mai mare divizor comun al două numere a și b folosind algoritmul lui Euclid.
Funcția `solve(x, y)` calculează cel mai mic multiplu comun al lui x și y folosind gcd și apoi calculează pentru fiecare valoare k între 1 și gcd(x, y) valoarea LCM(x+k, y+k) și determină valoarea minimă a lui k astfel încât LCM(x+k, y+k) să fie minim. Valoarea minimă a lui k și LCM(x+k, y+k) sunt stocate în variabilele `min_k` și `min_lcm`. La sfârșit, funcția afișează valoarea lui `min_k`.
În `main()`, se citește cele două numere de la tastatură folosind `map()` și apoi se verifică dacă datele de intrare sunt corecte folosind funcția `validate_input(x, y)`. Dacă datele de intrare sunt incorecte, se afișează un mesaj corespunzător. În caz contrar, se afișează un mesaj de confirmare și se apelează funcția `solve(x, y)`.