0285 - X2Y2K: Diferență între versiuni

De la Universitas MediaWiki
 
(Nu s-au afișat 9 versiuni intermediare efectuate de același utilizator)
Linia 4: Linia 4:


== Date de intrare ==
== Date de intrare ==
Programul citește de la tastatură numărul '''n'''.
Programul citește de la tastatură numărul '''k'''.
 
== Date de ieșire ==  
== Date de ieșire ==  
Programul va afișa pe ecran,  mesajul "Datele introduse corespund cerințelor" și pe o linie nouă numărul '''P''' , reprezentând produsul primelor '''n''' pătrate perfecte nenule, în caz contrar programul va afișa pe o linie noua mesajul "Datele introduse nu corespund cerintelor."
Programul afișează perechile '''x, y''' determinate, câte o pereche pe o linie a ecranului, în ordinea crescătoare a valorii lui x.


Dacă datele sunt introduse corect, programul va rula.
Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou afișează toate perechile de numere naturale nenule x, y (x<=y), cu proprietatea că x2+y2=k.  


În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: ''' "Datele nu corespund restricțiilor impuse.".'''
Î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 ==
* 0 &lt; '''n''' &les; 10
2 ≤ '''k''' ≤ 1.000.000.000
 
pentru toate valorile lui '''k''' utilizate în teste există cel puţin o soluţie


== Exemplul 1 ==
== Exemplul 1 ==
; Intrare
; Datele de intrare
: 4
:Introduceti valoarea lui k:
; Ieșire
: 1000000
: Datele corespund cerințelor.
; Datele de ieșire
: 576
: Datele sunt introduse corect.
: 280 960
: 352 936
: 600 800
<br>
<br>


== Rezolvare ==  
== Rezolvare ==  
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
#4273
#0285
def patrate_perfecte(n):
    patrate = []
    i = 1
    while len(patrate) < n:
        patrat = i * i
        patrate.append(patrat)
        i += 1
    return patrate


import math


def calculeaza(numbers):
def is_sum_of_squares(x, y, k):
     product = 1
     """
     for number in numbers:
     Returns True if x^2 + y^2 is equal to k, False otherwise.
        product *= number
    """
     return product
     return x**2 + y**2 == k


 
def has_valid_factors(k):
def validare_numar(n):
     """
     if n < 1 or n > 10:
    Returns True if k has only factors of the form 4n+1, False otherwise.
    """
    for i in range(2, int(math.sqrt(k))+1):
        if k % i == 0:
            p = 0
            while k % i == 0:
                k //= i
                p += 1
            if i % 4 == 3 and p % 2 != 0:
                return False
    if k % 4 == 3:
         return False
         return False
     return True
     return True


def find_sum_of_squares_pairs(k):
    """
    Finds all pairs of natural numbers (x,y) such that x^2 + y^2 is equal to k.
    Returns a list of tuples.
    """
    pairs = []
    for x in range(1, int(math.sqrt(k))+1):
        for y in range(x, int(math.sqrt(k))+1):
            if is_sum_of_squares(x, y, k) and has_valid_factors(k):
                pairs.append((x, y))
    return pairs


if __name__ == '__main__':
if __name__ == '__main__':
     n = int(input("Introduceți numărul n: "))
     k = int(input("Introduceti valoarea lui k: "))
     if not validare_numar(n):
     if 2 <= k <= 1000000000:
         print("Datele introduse nu corespund cerintelor.")
        print("Datele sunt introduse corect.")
        pairs = find_sum_of_squares_pairs(k)
 
        if pairs:
            for pair in pairs:
 
                print(pair[0], pair[1])
         else:
            print("Nu exista perechi (x,y) cu x, y > 0 astfel incat x^2 + y^2 = k.")
     else:
     else:
        squares = patrate_perfecte(n)
         print("Datele nu corespund restricțiilor impuse.")  
        product = calculeaza(squares)
 
         print("Datele introduse corespund cerintelor.")
</syntaxhighlight>
        print(product)
 
'''Explicatie cod:'''


Acest cod contine trei functii care lucreaza impreuna pentru a gasi toate perechile de numere naturale (x,y) astfel incat x^2 + y^2 sa fie egal cu k. Mai exact:


</syntaxhighlight>
is_sum_of_squares(x, y, k) verifica daca x^2 + y^2 este egal cu k si returneaza True sau False in consecinta.
 
has_valid_factors(k) verifica daca toate factorii lui k sunt de forma 4n+1 si returneaza True sau False in consecinta.
 
find_sum_of_squares_pairs(k) parcurge toate perechile de numere naturale (x,y) cu x <= y si verifica daca x^2 + y^2 este egal cu k si daca k are doar factori de forma 4n+1. Daca conditiile sunt satisfacute, perechea este adaugata la o lista si, la sfarsit, lista este returnata.
 
La final, codul verifica daca valoarea k introdusa de utilizator este intre 2 si 1000000000, inclusiv. Daca nu este, se afiseaza un mesaj de eroare. Daca este, se cauta toate perechile (x,y) astfel incat x^2 + y^2 = k si se afiseaza rezultatul, sau un mesaj care indica ca nu exista astfel de perechi. De asemenea, toate acestea se intampla doar daca acest script este rulat direct (if name == 'main':), nu daca este importat ca modul in alt script.

Versiunea curentă din 27 aprilie 2023 07:15

Sursa: [1]

Cerinţa

Se dă un număr natural, k. Să se determine toate perechile de numere naturale nenule x, y (x<=y), cu proprietatea că x2+y2=k .

Date de intrare

Programul citește de la tastatură numărul k.

Date de ieșire

Programul afișează perechile x, y determinate, câte o pereche pe o linie a ecranului, în ordinea crescătoare a valorii lui x.

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou afișează toate perechile de numere naturale nenule x, y (x<=y), cu proprietatea că x2+y2=k.

În caz contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse."

Restricţii şi precizări

2 ≤ k ≤ 1.000.000.000

pentru toate valorile lui k utilizate în teste există cel puţin o soluţie

Exemplul 1

Datele de intrare
Introduceti valoarea lui k:
1000000
Datele de ieșire
Datele sunt introduse corect.
280 960
352 936
600 800


Rezolvare

#0285

import math

def is_sum_of_squares(x, y, k):
    """
    Returns True if x^2 + y^2 is equal to k, False otherwise.
    """
    return x**2 + y**2 == k

def has_valid_factors(k):
    """
    Returns True if k has only factors of the form 4n+1, False otherwise.
    """
    for i in range(2, int(math.sqrt(k))+1):
        if k % i == 0:
            p = 0
            while k % i == 0:
                k //= i
                p += 1
            if i % 4 == 3 and p % 2 != 0:
                return False
    if k % 4 == 3:
        return False
    return True

def find_sum_of_squares_pairs(k):
    """
    Finds all pairs of natural numbers (x,y) such that x^2 + y^2 is equal to k.
    Returns a list of tuples.
    """
    pairs = []
    for x in range(1, int(math.sqrt(k))+1):
        for y in range(x, int(math.sqrt(k))+1):
            if is_sum_of_squares(x, y, k) and has_valid_factors(k):
                pairs.append((x, y))
    return pairs

if __name__ == '__main__':
    k = int(input("Introduceti valoarea lui k: "))
    if 2 <= k <= 1000000000:
        print("Datele sunt introduse corect.")
        pairs = find_sum_of_squares_pairs(k)

        if pairs:
            for pair in pairs:

                print(pair[0], pair[1])
        else:
            print("Nu exista perechi (x,y) cu x, y > 0 astfel incat x^2 + y^2 = k.")
    else:
        print("Datele nu corespund restricțiilor impuse.")

Explicatie cod:

Acest cod contine trei functii care lucreaza impreuna pentru a gasi toate perechile de numere naturale (x,y) astfel incat x^2 + y^2 sa fie egal cu k. Mai exact:

is_sum_of_squares(x, y, k) verifica daca x^2 + y^2 este egal cu k si returneaza True sau False in consecinta.

has_valid_factors(k) verifica daca toate factorii lui k sunt de forma 4n+1 si returneaza True sau False in consecinta.

find_sum_of_squares_pairs(k) parcurge toate perechile de numere naturale (x,y) cu x <= y si verifica daca x^2 + y^2 este egal cu k si daca k are doar factori de forma 4n+1. Daca conditiile sunt satisfacute, perechea este adaugata la o lista si, la sfarsit, lista este returnata.

La final, codul verifica daca valoarea k introdusa de utilizator este intre 2 si 1000000000, inclusiv. Daca nu este, se afiseaza un mesaj de eroare. Daca este, se cauta toate perechile (x,y) astfel incat x^2 + y^2 = k si se afiseaza rezultatul, sau un mesaj care indica ca nu exista astfel de perechi. De asemenea, toate acestea se intampla doar daca acest script este rulat direct (if name == 'main':), nu daca este importat ca modul in alt script.