3340 - Perfect 1: Difference between revisions
Pagină nouă: == Cerinţa == Cerința Se dau '''n''' numere naturale. Să se determine cel mai mare număr perfect mai mic sau egal cu '''8128''' care poate fi scris ca produs al unora dintre numerele date. Un număr natural este perfect dacă dublul său este egal cu suma divizorilor săi. == Date de intrare == Fișierul de intrare '''perfect1.in''' conține pe prima linie numărul '''n''', iar pe a doua linie '''n''' numere naturale separate prin spații. == Date de ieșire == Fișierul... |
|||
(One intermediate revision by one other user not shown) | |||
Line 1: | Line 1: | ||
== Cerinţa == | == Cerinţa == | ||
Se dau '''n''' numere naturale. Să se determine cel mai mare număr perfect mai mic sau egal cu '''8128''' care poate fi scris ca produs al unora dintre numerele date. Un număr natural este perfect dacă dublul său este egal cu suma divizorilor săi. | Se dau '''n''' numere naturale. Să se determine cel mai mare număr perfect mai mic sau egal cu '''8128''' care poate fi scris ca produs al unora dintre numerele date. Un număr natural este perfect dacă dublul său este egal cu suma divizorilor săi. | ||
== Date de intrare == | == Date de intrare == | ||
Fișierul de intrare ''' | Fișierul de intrare '''perfect1in.txt''' conține pe prima linie numărul '''n''', iar pe a doua linie '''n''' numere naturale separate prin spații. | ||
== Date de ieșire == | == Date de ieșire == | ||
Fișierul de ieșire ''' | Fișierul de ieșire '''perfect1out.txt''' va conține pe prima linie numărul '''S''', reprezentând cel mai mare număr perfect care poate fi scris ca produs al unora dintre numerele de pe a doua linie a fișierului de intrare sau mesajul '''NU''' dacă nu se nu există un asemenea număr. | ||
== Restricţii şi precizări == | == Restricţii şi precizări == | ||
* 1 ⩽ n ⩽ 100 | * 1 ⩽ n ⩽ 100 | ||
* numerele de pe a doua linie a fișierului de intrare și numerele perfecte determinate vor fi mai mici decât '''8128''' | * numerele de pe a doua linie a fișierului de intrare și numerele perfecte determinate vor fi mai mici decât '''8128''' | ||
== Exemplu == | == Exemplu == | ||
; | ; perfect1in.txt | ||
: 7 | : 7 | ||
: 2 7 9 2 2 31 2 | : 2 7 9 2 2 31 2 | ||
; | ; perfect1out.txt | ||
: Datele de intrare corespund restrictiilor impuse | |||
: 496 | : 496 | ||
<br> | |||
== Exemplu 2 == | == Exemplu 2 == | ||
; | ; perfect1in.txt | ||
: 6 | : 6 | ||
: 2 31 127 2 2 5 | : 2 31 127 2 2 5 | ||
; | ; perfect1out.txt | ||
: Datele de intrare corespund restrictiilor impuse | |||
: NU | : NU | ||
<br> | |||
== Exemplu 3 == | |||
; perfect1in.txt | |||
: 7 | |||
: 2 7 9 2 2 ab 2 | |||
; perfect1out.txt | |||
: Datele de intrare nu corespund restrictiilor impuse | |||
<br> | |||
== Rezolvare == | == Rezolvare == | ||
<syntaxhighlight lang="python" line> | <syntaxhighlight lang="python" line> | ||
# | def validare(numar, arr, fileout): # functia de validare a datelor de intrare | ||
def perfect_numbers( | |||
perfects = [6, 28, 496, 8128] | if len(arr) != numar: | ||
max_perfect = -1 | raise ValueError | ||
for i in range(1, 1 << | |||
if numar > 300000: | |||
raise ValueError | |||
for numar in arr: | |||
if not isinstance(numar, int) or numar < 1 or numar > 2147483647: | |||
raise ValueError | |||
fileout.write("Datele de intrare corespund restrictiilor impuse\n") | |||
def perfect_numbers(numar_1, arr): | |||
perfects = [6, 28, 496, 8128] | |||
max_perfect = -1 | |||
for i in range(1, 1 << numar_1): | |||
prod = 1 | prod = 1 | ||
for j in range(n): | for j in range(n): | ||
if (i >> j) & 1: | if (i >> j) & 1: | ||
prod *= arr[j] | prod *= arr[j] | ||
if prod in perfects and prod > max_perfect: | if prod in perfects and prod > max_perfect: | ||
max_perfect = prod | max_perfect = prod | ||
return max_perfect | return max_perfect | ||
# | if __name__ == '__main__': | ||
result = perfect_numbers(n, | file_in = open("perfect1in.txt", "r") # declararea fisierelor | ||
file_out = open("perfect1out.txt", "w") # fisierul out trebuie declarat cu optiunea "w" (write) | |||
try: | |||
n = int(file_in.readline()) | |||
numbers = list(map(int, file_in.readline().split())) | |||
validare(n, numbers, file_out) # apelul functiei de validare | |||
result = perfect_numbers(n, numbers) # apelul functiei de rezolvare | |||
if result != -1: | |||
file_out.write(str(result)) # Dacă am găsit un număr perfect, îl scriem în fișier | |||
else: | |||
file_out.write("NU") # Dacă nu am găsit niciun număr perfect, scriem "NU" în fișier | |||
except ValueError: | |||
file_out.write("Datele de intrare nu corespund restrictiilor impuse") | |||
except IndexError: | |||
file_out.write("Datele de intrare nu corespund restrictiilor impuse") | |||
</syntaxhighlight> | </syntaxhighlight> |
Latest revision as of 12:19, 13 November 2023
Cerinţa[edit | edit source]
Se dau n numere naturale. Să se determine cel mai mare număr perfect mai mic sau egal cu 8128 care poate fi scris ca produs al unora dintre numerele date. Un număr natural este perfect dacă dublul său este egal cu suma divizorilor săi.
Date de intrare[edit | edit source]
Fișierul de intrare perfect1in.txt conține pe prima linie numărul n, iar pe a doua linie n numere naturale separate prin spații.
Date de ieșire[edit | edit source]
Fișierul de ieșire perfect1out.txt va conține pe prima linie numărul S, reprezentând cel mai mare număr perfect care poate fi scris ca produs al unora dintre numerele de pe a doua linie a fișierului de intrare sau mesajul NU dacă nu se nu există un asemenea număr.
Restricţii şi precizări[edit | edit source]
- 1 ⩽ n ⩽ 100
- numerele de pe a doua linie a fișierului de intrare și numerele perfecte determinate vor fi mai mici decât 8128
Exemplu[edit | edit source]
- perfect1in.txt
- 7
- 2 7 9 2 2 31 2
- perfect1out.txt
- Datele de intrare corespund restrictiilor impuse
- 496
Exemplu 2[edit | edit source]
- perfect1in.txt
- 6
- 2 31 127 2 2 5
- perfect1out.txt
- Datele de intrare corespund restrictiilor impuse
- NU
Exemplu 3[edit | edit source]
- perfect1in.txt
- 7
- 2 7 9 2 2 ab 2
- perfect1out.txt
- Datele de intrare nu corespund restrictiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line>
def validare(numar, arr, fileout): # functia de validare a datelor de intrare
if len(arr) != numar: raise ValueError
if numar > 300000: raise ValueError
for numar in arr: if not isinstance(numar, int) or numar < 1 or numar > 2147483647: raise ValueError
fileout.write("Datele de intrare corespund restrictiilor impuse\n")
def perfect_numbers(numar_1, arr):
perfects = [6, 28, 496, 8128] max_perfect = -1 for i in range(1, 1 << numar_1): prod = 1 for j in range(n): if (i >> j) & 1: prod *= arr[j] if prod in perfects and prod > max_perfect: max_perfect = prod return max_perfect
if __name__ == '__main__':
file_in = open("perfect1in.txt", "r") # declararea fisierelor file_out = open("perfect1out.txt", "w") # fisierul out trebuie declarat cu optiunea "w" (write)
try: n = int(file_in.readline()) numbers = list(map(int, file_in.readline().split()))
validare(n, numbers, file_out) # apelul functiei de validare result = perfect_numbers(n, numbers) # apelul functiei de rezolvare
if result != -1: file_out.write(str(result)) # Dacă am găsit un număr perfect, îl scriem în fișier else: file_out.write("NU") # Dacă nu am găsit niciun număr perfect, scriem "NU" în fișier
except ValueError: file_out.write("Datele de intrare nu corespund restrictiilor impuse") except IndexError: file_out.write("Datele de intrare nu corespund restrictiilor impuse")
</syntaxhighlight>
Explicatie[edit | edit source]
Inmultind 2*2*2*31*2 obținem numărul 496 .