4190 - FPatrate
Cerința
Subprogramul patrate are trei parametri:
- n, prin care primește un număr natural (n∈[2,109]);
- x și y, prin care furnizează câte un număr natural cu proprietatea că x2⋅y2=nși 2≤x<ysau valoarea 0, prin fiecare dintre aceștia, dacă nu există două astfel de numere. Dacă sunt mai multe astfel de valori, se furnizează cele corespunzătoare unei valori minime a lui x.
Scrieți definiția completă a subprogramului.
Exemplu
Pentru n=400, după apel, x=2 şi y=10, iar pentru n=16 sau n=24, după apel, x=0 și y=0.
Important
Soluția propusă va conține definiția funcţiei cerute. Prezența în soluție a altor instrucțiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluției.
Rezolvare
Rezolvare ver. 1
<syntaxhighlight lang="python" line="1" start="1">
def patrate(n):
x = 0
y = 0
min_x = float('inf') # valoare inițială infinită pentru a găsi cel mai mic x
for i in range(2, int(n ** 0.5) + 1): # caută toate valorile posibile pentru x
if n % (i ** 2) == 0: # dacă x este factor al lui n, încercă să găsești y
j = n // (i ** 2)
if i < j and j <= int(n ** 0.5) and n == i ** 2 * j ** 2: # verifică condițiile y-ului
if i < min_x: # dacă acest x este mai mic decât cele găsite anterior, actualizează x și y
min_x = i
x = i
y = j
if x == 0 and y == 0: # dacă nu se găsesc perechi x, y care să satisfacă condițiile, returnează 0, 0
return 0, 0
else:
return x, y
def main():
n = 400
x, y = patrate(n)
print(f"Pentru n = {n}, x = {x} și y = {y}")
n = 16
x, y = patrate(n)
print(f"Pentru n = {n}, x = {x} și y = {y}")
n = 24
x, y = patrate(n)
print(f"Pentru n = {n}, x = {x} și y = {y}")
if __name__ == '__main__':
main()
</syntaxhighlight>