이 글에서는 자바를 사용하여 어떤 숫자가 완전수(Perfect Number)인지 확인하는 방법을 알아봅니다. 완전수란 자기 자신을 제외한 약수들의 합이 자기 자신과 같은 양의 정수를 의미합니다.
예를 들어 6의 약수는 1, 2, 3이며, 이들의 합이 6이므로 6은 완전수입니다. 대표적인 완전수로는 6, 28, 496, 8128 등이 있습니다.
아래는 실제 실행 결과의 예시입니다.
입력
사용자가 다음과 같이 입력했다고 가정해 보겠습니다.
숫자를 입력하세요 : 496
출력
원하는 출력 결과는 다음과 같습니다.
숫자 496은(는) 완전수입니다
알고리즘
1단계 - 시작 2단계 - long 타입 변수 my_input, my_sum과 int 타입 변수 i를 선언한다. 3단계 - 사용자로부터 값을 입력받거나 미리 값을 정의한다. 4단계 - while 반복문을 사용하여 지정된 조건에 도달할 때까지 반복한다. 5단계 - my_input % i의 나머지가 0인지 확인한다. 나머지가 없다면 my_sum에 i를 더한 값을 my_sum에 저장하고, i 값을 1 증가시킨다. 6단계 - my_sum 값이 입력값과 같으면 완전수이고, 그렇지 않으면 완전수가 아니다. 7단계 - 결과를 출력한다. 8단계 - 종료한다.
예제 1: 사용자 입력으로 확인하기
아래 예제에서는 사용자가 직접 숫자를 입력하면 해당 숫자가 완전수인지 판별하여 결과를 출력합니다.
import java.util.Scanner;
public class PerfectNumber{
public static void main(String args[]){
long my_input, my_sum;
int i;
my_sum=0;
System.out.println("필요한 패키지를 가져왔습니다");
Scanner my_scanner = new Scanner(System.in);
System.out.println("리더 객체가 정의되었습니다");
System.out.print("숫자를 입력하세요 : ");
my_input = my_scanner.nextLong();
i=1;
while(i <= my_input/2){
if(my_input % i == 0){
my_sum = my_sum + i;
}
i++;
}
if(my_sum==my_input)
System.out.println("숫자 " +my_input+ "은(는) 완전수입니다");
else
System.out.println("숫자 " +my_input+ "은(는) 완전수가 아닙니다");
}
}실행 결과
필요한 패키지를 가져왔습니다 리더 객체가 정의되었습니다 숫자를 입력하세요 : 496 숫자 496은(는) 완전수입니다
이 코드에서는 반복문이 1부터 입력값의 절반(my_input/2)까지만 돌아갑니다. 자기 자신을 제외한 가장 큰 약수는 입력값의 절반이므로, 절반까지만 검사하면 효율적으로 모든 약수를 구할 수 있습니다.
예제 2: 미리 정의된 값으로 확인하기
아래 예제에서는 숫자가 코드 안에 미리 정의되어 있으며, 해당 값을 콘솔에 출력하고 완전수 여부를 판별합니다.
import java.util.Scanner;
public class PerfectNumber{
public static void main(String args[]){
long my_input, my_sum;
int i;
my_sum=0;
my_input = 496;
System.out.println("정의된 숫자는 " +my_input+ " 입니다");
i=1;
while(i <= my_input/2){
if(my_input % i == 0){
my_sum = my_sum + i;
}
i++;
}
if(my_sum==my_input)
System.out.println("숫자 " +my_input+ "은(는) 완전수입니다");
else
System.out.println("숫자 " +my_input+ "은(는) 완전수가 아닙니다");
}
}실행 결과
정의된 숫자는 496 입니다 숫자 496은(는) 완전수입니다
마무리
두 예제 모두 동일한 핵심 로직을 사용합니다. 1부터 입력값의 절반까지 반복하면서 나누어 떨어지는 수(약수)를 모두 더하고, 그 합이 원래 숫자와 같은지 비교하는 방식입니다. 이 로직을 응용하면 특정 범위 내의 모든 완전수를 찾는 프로그램도 손쉽게 작성할 수 있습니다.