Numero perfetto - Leetcode 507

Dec 16 2022
Link al problema originale: https://leetcode.com/problems/perfect-number/ In questo problema, ci viene chiesto di determinare se un dato numero intero n è un numero perfetto, definito come un numero intero uguale alla somma di tutti i suoi numeri positivi divisori (escluso n stesso).

Link problema originale:https://leetcode.com/problems/perfect-number/

In questo problema, ci viene chiesto di determinare se un dato numero intero n è un numero perfetto, definito come un numero intero uguale alla somma di tutti i suoi divisori positivi (escluso n stesso).

Il modo più intuitivo per farlo è eseguire il ciclo da 2 fino a n/2 e tenere traccia della somma parziale. Tuttavia, non a caso, ciò fornisce un'eccezione per il superamento del limite di tempo per i grandi numeri.

Quindi ho pensato a una soluzione più veloce perché matematicamente, quando troviamo un fattore, c'è sempre un altro fattore che gli corrisponde che dovrebbe essere anch'esso parte della somma (es. se n = 28 e partiamo da 2, allora 28 / 2 = 14 dovrebbe anche essere un fattore e possiamo dimezzare il numero dei loop in questo modo poiché possiamo colmare il divario più velocemente). Questa è la soluzione accettata che mi è venuta in mente:

class Solution {
    public boolean checkPerfectNumber(int num) {
        if (num == 1) {
            return false;
        }
        int sum = 1;
        int left = 2;
        int right = num / 2;
        while (left < right) {
            if (num % left == 0) {
                sum += left;
                sum += (num / left);
                right = num / left;
            }
            left++;
        }
        return sum == num;
    }
}