2021 - Sumă Gauss2: Diferență între versiuni

De la Universitas MediaWiki
(Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/4273/prodpp] == Cerinţa == Se dă numărul natural nenul '''n'''. Să se determine produsul primelor '''n''' pătrate perfecte nenule. == Date de intrare == Programul citește de la tastatură numărul '''n'''. == Date de ieșire == Dacă datele introduse sunt corecte și respectă formatul așteptat, programul va afișa un mesaj pe ecran cu textul "Datele sunt introduse corect.", iar apoi va afișa în continuare, pe un rând nou, ele...)
 
Linia 35: Linia 35:
== Rezolvare ==  
== Rezolvare ==  
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
#4273
#2021
def patrate_perfecte(n):
def read_input_file(input_file):
     patrate = []
     with open(input_file, 'r') as f:
    i = 1
         s = int(f.readline().strip())
    while len(patrate) < n:
     return s
         patrat = i * i
        patrate.append(patrat)
        i += 1
     return patrate




def calculeaza(numbers):
def write_output_file(output_file, solutions):
     product = 1
     with open(output_file, 'w') as f:
    for number in numbers:
        for p in solutions:
        product *= number
            f.write(f"{p[0]} {p[1]}\n")
    return product




def validare_numar(n):
def find_solutions(s):
    if n < 1 or n > 10:
    solutions = []
        return False
    for n in range(s, 0, -1):
     return True
        sn = n * (n + 1) // 2
        for m in range(n):
            sm = m * (m + 1) // 2
            d = sn - sm
            if d == s and n > m:
                solutions.append((n, m))
    solutions.sort(reverse=True)
     return solutions




if __name__ == '__main__':
if __name__ == '__main__':
     n = int(input("Introduceți numărul n: "))
     # Citim numărul S din fișierul de intrare
     if not validare_numar(n):
     input_file = 'sumagauss2.in'
        print("Datele introduse nu corespund cerintelor.")
     s = read_input_file(input_file)
     else:
        squares = patrate_perfecte(n)
        product = calculeaza(squares)
        print("Datele introduse corespund cerintelor.")
        print(product)


    # Găsim toate perechile (n, m) cu diferența dată S
    solutions = find_solutions(s)
    # Scriem perechile în ordine descrescătoare după n în fișierul de ieșire
    output_file = 'sumagauss2.out'
    write_output_file(output_file, solutions)
'''Acest program are rolul de a găsi toate perechile de numere naturale (n, m) astfel încât diferența dintre suma primelor n numere naturale și suma primelor m numere naturale să fie egală cu un anumit număr S dat.
Funcția "read_input_file" primește ca parametru numele fișierului de intrare și returnează numărul S citit din fișierul respectiv.
Funcția "write_output_file" primește ca parametri numele fișierului de ieșire și o listă de perechi (n, m) și scrie aceste perechi în fișierul de ieșire, fiecare pe o linie separată. Funcția "find_solutions" primește ca parametru numărul S și returnează o listă cu toate perechile (n, m) care îndeplinesc condiția dată, sortate descrescător după n.
În funcția "find_solutions", se parcurg toate numerele naturale de la s până la 1 și se calculează suma primelor n numere naturale pentru fiecare n, apoi se parcurg toate numerele naturale de la 0 până la n-1 și se calculează suma primelor m numere naturale pentru fiecare m.
Se calculează diferența dintre aceste sume și se verifică dacă este egală cu numărul S dat.
Dacă este, perechea (n, m) este adăugată la lista de soluții. La final, lista de soluții este sortată descrescător după n și returnată.
În blocul "if name == 'main'", se citește numărul S din fișierul de intrare, se găsesc toate perechile (n, m) cu diferența dată S folosind funcția "find_solutions", iar apoi se scriu perechile în ordine descrescătoare după n în fișierul de ieșire folosind funcția "write_output_file".
Numele fișierelor de intrare și de ieșire sunt specificate în variabilele "input_file" și, respectiv, "output_file".'''


</syntaxhighlight>
</syntaxhighlight>

Versiunea de la data 1 aprilie 2023 10:54

Sursa: [1]

Cerinţa

Se dă numărul natural nenul n. Să se determine produsul primelor n pătrate perfecte nenule.

Date de intrare

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

Date de ieșire

Dacă datele introduse sunt corecte și respectă formatul așteptat, programul va afișa un mesaj pe ecran cu textul "Datele sunt introduse corect.", iar apoi va afișa în continuare, pe un rând nou, elementele vectorului y, separate prin exact un spațiu.

În cazul în care datele din fișierul de intrare nu respectă restricțiile impuse (de exemplu, nu este un număr întreg), programul va afișa pe ecran mesajul "Datele nu corespund restricțiilor impuse." și nu va continua cu restul execuției programului.

Restricţii şi precizări

  • 0 < n ⩽ 10

Exemplul 1

Intrare
4
Ieșire
Datele corespund cerințelor.
576


Exemplul 2

Intrare
16
Ieșire
Datele introduse nu corespund cerințelor.


Exemplul 3

Intrare
7
Ieșire
Datele corespund cerințelor.
25401600


Rezolvare

#2021
def read_input_file(input_file):
    with open(input_file, 'r') as f:
        s = int(f.readline().strip())
    return s


def write_output_file(output_file, solutions):
    with open(output_file, 'w') as f:
        for p in solutions:
            f.write(f"{p[0]} {p[1]}\n")


def find_solutions(s):
    solutions = []
    for n in range(s, 0, -1):
        sn = n * (n + 1) // 2
        for m in range(n):
            sm = m * (m + 1) // 2
            d = sn - sm
            if d == s and n > m:
                solutions.append((n, m))
    solutions.sort(reverse=True)
    return solutions


if __name__ == '__main__':
    # Citim numărul S din fișierul de intrare
    input_file = 'sumagauss2.in'
    s = read_input_file(input_file)

    # Găsim toate perechile (n, m) cu diferența dată S
    solutions = find_solutions(s)

    # Scriem perechile în ordine descrescătoare după n în fișierul de ieșire
    output_file = 'sumagauss2.out'
    write_output_file(output_file, solutions)


'''Acest program are rolul de a găsi toate perechile de numere naturale (n, m) astfel încât diferența dintre suma primelor n numere naturale și suma primelor m numere naturale să fie egală cu un anumit număr S dat.
Funcția "read_input_file" primește ca parametru numele fișierului de intrare și returnează numărul S citit din fișierul respectiv.
Funcția "write_output_file" primește ca parametri numele fișierului de ieșire și o listă de perechi (n, m) și scrie aceste perechi în fișierul de ieșire, fiecare pe o linie separată. Funcția "find_solutions" primește ca parametru numărul S și returnează o listă cu toate perechile (n, m) care îndeplinesc condiția dată, sortate descrescător după n.
În funcția "find_solutions", se parcurg toate numerele naturale de la s până la 1 și se calculează suma primelor n numere naturale pentru fiecare n, apoi se parcurg toate numerele naturale de la 0 până la n-1 și se calculează suma primelor m numere naturale pentru fiecare m.
Se calculează diferența dintre aceste sume și se verifică dacă este egală cu numărul S dat.
Dacă este, perechea (n, m) este adăugată la lista de soluții. La final, lista de soluții este sortată descrescător după n și returnată.
În blocul "if name == 'main'", se citește numărul S din fișierul de intrare, se găsesc toate perechile (n, m) cu diferența dată S folosind funcția "find_solutions", iar apoi se scriu perechile în ordine descrescătoare după n în fișierul de ieșire folosind funcția "write_output_file".
Numele fișierelor de intrare și de ieșire sunt specificate în variabilele "input_file" și, respectiv, "output_file".'''