Cum funcționează
Un număr perfect e egal cu suma divizorilor proprii — adică toți divizorii lui, fără el însuși.
Cel mai mic exemplu este 6, pentru că 1 + 2 + 3 = 6. Următorul este 28.
Rezolvarea are un singur pas real: aduni divizorii, apoi compari. Frumusețea e că aceeași sumă
folosește la ambele ramuri ale enunțului — dacă e egală cu n, afișezi DA; dacă nu, chiar ea
e răspunsul cerut. De aceea se calculează o singură dată, într-o variabilă.
Bucla merge doar până la n / 2, iar asta nu e o optimizare oarecare, ci vine direct din enunț:
niciun divizor propriu al lui n nu poate fi mai mare decât n / 2. Dacă un număr d mai
mare decât jumătate l-ar împărți exact pe n, atunci n / d ar fi mai mic decât 2, deci ar
trebui să fie 1 — adică d ar fi chiar n. Pe care oricum îl excludem.
Pentru n = 28, bucla trece prin 1, 2, ..., 14 și adună 1 + 2 + 4 + 7 + 14 = 28. Egal cu n,
deci DA.
Greșeli frecvente
d <= n în loc de d <= n / 2 — îl include pe n însuși în sumă, deci suma iese mereu mai
mare decât n și niciun număr nu mai apare ca perfect. E greșeala numărul unu la această
problemă.
- Pornirea buclei de la
d = 2 — îl sare pe 1, care e divizor propriu pentru orice număr.
Pentru 28 ai obține 27 și răspuns greșit.
- Afișarea sumei și când numărul e perfect — enunțul cere
DA, nu valoarea. Cele două ramuri
se exclud.
- Neinițializarea lui
s — int s; fără = 0 pornește de la o valoare oarecare din memorie,
iar rezultatul devine imprevizibil de la o rulare la alta.