2915 - Sum Square

De la Universitas MediaWiki

Cerința

Se dă numărul natural n. Determinați dacă numărul se poate scrie ca sumă de două pătrate perfecte. Dacă da, afișați două pătrate perfecte a căror sumă este n, în ordine crescătoare, sau mesajul NU în caz contrar.

Date de intrare

Programul citește de la tastatură numărul n;

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Date de intrare valide.", apoi programul va afișa pe ecran cele 2 pătrate care alcătuiesc numărul sau mesajul NU în cazul în care nu există. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: "Date de intrare invalide".

Restricții și precizări

1≤n≤1015 dacă există mai multe perechi de pătrate perfecte a căror sumă este n, poate fi afișată oricare

Exemplu:

Intrare

169

Ieșire

Date de intrare valide
25 144

Rezolvare

import math


def validare_date(n):
    """Functie de validare"""
    if not 1 <= n <= 10**15:
        print("Numarul introdus trebuie sa fie intre 1 si 10^15.")
        return False
    return True


def sum_square(n):
    ok = False
    for i in range(1, int(math.sqrt(n // 2)) + 1):
        x = i * i
        y = n - x
        j = int(math.sqrt(y))

        if j * j == y and not ok:
            print(min(y, x), max(x, y))
            ok = True

    if not ok:
        print("NU")


if __name__ == '__main__':
    n = int(input())
    if validare_date(n):
        print("Date de intrare valide")
        sum_square(n)
    else:
        print("Date de intrare invalide")

Explicatie cod:

Funcția validare_date(n) primește un număr n și verifică dacă acesta se află în intervalul [1, 10^15]. Dacă numărul nu respectă această condiție, se afișează un mesaj de eroare și se returnează False. În caz contrar, se returnează True. Funcția sum_square(n) primește un număr n și calculează perechile de numere x și y, astfel încât x^2 + y^2 = n. Pentru a verifica această condiție, se utilizează două bucle for. Prima buclă iterează de la 1 până la radicalul pătrat al lui n // 2, iar în interiorul primei bucle se calculează x = i*i și y = n - x. Apoi, se verifică dacă y este un pătrat perfect (adica j * j == y) și se afișează perechea (x, y) dacă această condiție este îndeplinită. Se folosește o variabilă ok pentru a se asigura că se afișează doar prima pereche găsită. În blocul if __name__ == '__main__':, se citește de la intrare un număr n utilizând funcția input(). Apoi, se verifică dacă numărul este valid utilizând funcția validare_date(). Dacă numărul este valid, se afișează un mesaj de confirmare și se apelează funcția sum_square() pentru a găsi și afișa perechile (x, y). În caz contrar, se afișează un mesaj de eroare.