Check Perfect Number in Java
Problem
A perfect number is a number that equals the sum of its own proper divisors — the divisors other than the number itself.
Given a number, determine whether it is a perfect number.
Java Program
public class PerfectNumberCheck {
public static void main(String[] args) {
int n = 28;
int sum = 0;
for (int i = 1; i < n; i++) {
if (n % i == 0) sum += i; // add every proper divisor into the running total
}
System.out.println("Perfect number: " + (sum == n));
}
}Output
Core Logic
Adding up every number from 1 up to n - 1 that divides n evenly, then comparing that total against n itself, checks the definition directly.
- 1The loop tries every candidate
ifrom1up to, but not including,n. - 2
n % i == 0checks whetheriis a proper divisor ofn. - 3Every divisor found is added into
sum. - 4After the loop,
sum == nis the perfect-number condition.
28, the proper divisors are 1, 2, 4, 7, and 14 — adding them together gives exactly 28, so it's reported as perfect.Key Point: This checks every number up to n - 1 as a candidate divisor, which is simple to follow but does more work than necessary — divisors always come in pairs around √n.
Why: Every number from 1 up to n - 1 is tested as a potential divisor, so the loop's cost scales directly with n.
Key Concepts
Approach 2: Optimized (Divisor Pairs)
public class PerfectNumberCheckOptimized {
public static void main(String[] args) {
int n = 28;
int sum = 1; // 1 is a proper divisor of every number greater than 1
for (int i = 2; (long) i * i <= n; i++) {
if (n % i == 0) {
sum += i;
int pair = n / i;
if (pair != i) sum += pair; // avoid double-counting a perfect square's middle divisor
}
}
System.out.println("Perfect number: " + (sum == n));
}
}
Output
Core Logic
Every divisor below √n pairs up with a matching divisor above it — finding one half of each pair and adding both at once cuts the search down to the square root.
- 1
sumstarts at1, since 1 is a proper divisor of every number greater than 1. - 2The loop tries candidates
ifrom2up to√nonly. - 3When
idividesnevenly, bothiand its pair,n / i, are added intosum— unless they're the same value, which would double-count a perfect square's middle divisor. - 4The same
sum == ncomparison confirms the result.
28, finding the divisor 2 also finds its pair 14 (2 + 14 = 16), and finding 4 also finds its pair 7 (+ 4 + 7 = 27), plus the initial 1, giving sum = 28.Key Point: The pair != i check matters for perfect squares — without it, a divisor exactly at √n (like 5 for 25) would get added twice instead of once.
Why: Checking divisors only up to √n and adding both members of each divisor pair at once cuts the number of iterations from n down to about √n.
Key Concepts
Approach 3: Java 8
import java.util.stream.IntStream;
public class PerfectNumberCheckStream {
public static void main(String[] args) {
int n = 28;
// Sums every divisor from 1 up to n - 1
int sum = IntStream.range(1, n).filter(i -> n % i == 0).sum();
System.out.println("Perfect number: " + (sum == n));
}
}
Output
Core Logic
The same divisor-summing idea can be expressed as a stream — keep only the divisors, then reduce them down to a single total.
- 1
IntStream.range(1, n)generates every candidate from1up ton - 1. - 2
.filter(i -> n % i == 0)keeps only the numbers that dividenevenly. - 3
.sum()reduces the filtered stream down to a single total, the sum of every proper divisor. - 4Comparing that total against
nconfirms the perfect-number condition.
28 the loop version finds.Key Point: This does the same O(n) work as the primary loop, just expressed as a stream — the divisor-pairs optimization doesn't translate as directly into a single filter-and-sum pipeline.
Why: The stream still checks every candidate divisor from 1 to n - 1, the same O(n) work as the manual loop, just expressed as a filter-and-sum pipeline.