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>