0800 - Perfect

From Bitnami MediaWiki

Enunț[edit | edit source]

Un număr natural nenul se numește perfect dacă este egal cu suma divizorilor săi naturali strict mai mici decât el. Exemplu: 28 este număr perfect pentru că 28=1+2+4+7+14.

Cerință[edit | edit source]

Să se scrie o funcție Python care, pentru doi parametri, a și b, afișează pe ecran, separate prin câte un spațiu, în ordine descrescătoare, toate numerele perfecte din intervalul [a,b]. Dacă în interval nu există astfel de numere, subprogramul afișează pe ecran mesajul nu exista.


Date de intrare[edit | edit source]

Se citesc de la tastatură doi parametri, a și b, reprezentând capetele intervalului [a,b] în care căutăm numerele perfecte.

Date de ieșire[edit | edit source]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele de intrare corespund restricțiilor impuse." și programul va afișa numerele perfecte din intervalul [a,b] afișate pe ecran în ordine descrescătoare, separate prin câte un spațiu. Dacă nu există astfel de numere, se va afișa mesajul "nu exista". În caz contrar, se va afișa pe ecran: "Datele de intrare nu corespund restricțiilor impuse."

Restricții de precizări[edit | edit source]

  • numele funcției va fi perfect și va avea exact doi parametri, a și b, cu semnificația de mai sus
  • 1 ≤ a ≤ b ≤10000


Exemplu[edit | edit source]

Intrare
5 30
Ieșire
Datele de intrare corespund restricțiilor impuse.
28 6

Important[edit | edit source]

Soluţia propusă va conţine doar 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[edit | edit source]

Rezolvare ver. 1[edit | edit source]

<syntaxhighlight lang="python" line="1" start="1">

def perfect(a, b):

   # Verifică numerele perfecte din intervalul [a, b]
   perfect_numbers = []
   for num in range(a, b+1):
       divisors_sum = 0
       for i in range(1, num):
           if num % i == 0:
               divisors_sum += i
       if divisors_sum == num:
           perfect_numbers.append(num)
   
   # Afiseaza numerele perfecte în ordine descrescătoare
   if len(perfect_numbers) == 0:
       print("Nu exista numere perfecte în intervalul dat.")
   else:
       perfect_numbers.sort(reverse=True)
       print("Numerele perfecte din intervalul [{} , {}] sunt: {}".format(a, b, ' '.join(map(str, perfect_numbers))))


def validare(a, b):

   return 1 <= a <= b <= 10000


  1. Verificați restricțiile

if __name__ == '__main__':

   a, b = map(int, input().split())
   if not validare(a, b):
       print("Datele de intrare nu corespund restricțiilor impuse.")
   else:
       print("Datele de intrare corespund restricțiilor impuse.")
       perfect(a, b)


</syntaxhighlight>

Explicații[edit | edit source]

Acest program determină numerele perfecte dintr-un interval dat [a, b], unde un număr este considerat perfect dacă suma divizorilor săi proprii este egală cu numărul în sine.

Funcția perfect primește ca argumente capetele intervalului a și b și găsește toate numerele perfecte în acest interval. Pentru fiecare număr din interval, se calculează suma divizorilor săi proprii într-o buclă for. Dacă această sumă este egală cu numărul în sine, atunci numărul este considerat perfect și este adăugat la lista perfect_numbers. În cele din urmă, lista perfect_numbers este sortată în ordine descrescătoare și apoi afișată.

Funcția validare verifică dacă valorile a și b se află în intervalul [1, 10000] și returnează adevărat sau fals.

În programul principal, valorile a și b sunt citite de la tastatură și verificate prin apelul funcției validare. Dacă valorile sunt valide, atunci funcția perfect este apelată pentru a găsi numerele perfecte din intervalul dat. Dacă valorile nu sunt valide, se afișează un mesaj de eroare.