암스트롱 수란?
이 글에서는 주어진 숫자가 암스트롱 수(Armstrong Number)인지 확인하는 자바 프로그램 작성 방법을 알아봅니다. 암스트롱 수는 각 자릿수를 세제곱하여 모두 더한 값이 원래의 수와 같아지는 수를 의미합니다.
좀 더 일반적으로 표현하면, n자리 정수의 모든 자릿수를 분리해 각각 거듭제곱한 뒤 합산했을 때 그 합이 원래 수와 같다면 이 수를 n차(n-order) 암스트롱 수라고 부릅니다. 즉, 네 자리 수 abcd에 대해 다음 식이 성립하면 암스트롱 수입니다.
abcd = a⁴ + b⁴ + c⁴ + d⁴
3자리 수의 경우에는 각 자릿수의 세제곱의 합이 수 자신과 같습니다. 대표적인 예로 153을 들 수 있습니다.
153 = 1³ + 5³ + 3³ = 1 + 125 + 27 = 153
같은 방식으로 371과 407도 암스트롱 수입니다. 참고로 3자리 암스트롱 수는 153, 370, 371, 407 네 개뿐입니다.
동작 예시
입력
숫자를 입력하세요 : 407
출력
407은(는) 암스트롱 수입니다
알고리즘
- 시작합니다.
- my_input(입력값), my_temp(임시값), my_remainder(나머지), my_result(누적 합) 네 개의 정수 변수를 선언합니다.
- 사용자로부터 값을 입력받거나 값을 직접 정의합니다.
- %, / 연산자를 활용한 while 반복문을 실행합니다.
- 임시값을 10으로 나눈 나머지를 구해 마지막 자릿수를 얻습니다.
- 나머지를 세제곱하여 누적 합에 더합니다.
- 임시값을 10으로 나눠 다음 자릿수 검사를 준비합니다.
- 반복이 끝나면 누적 합과 입력값을 비교합니다. 두 값이 같으면 암스트롱 수이고, 그렇지 않으면 암스트롱 수가 아닙니다.
- 결과를 화면에 출력합니다.
- 종료합니다.
예제 1: 사용자 입력으로 확인하기
아래 예제는 Scanner를 사용해 사용자로부터 숫자를 입력받은 뒤, 해당 수가 암스트롱 수인지 판별합니다.
import java.util.Scanner;
public class IsArmstrong {
public static void main(String[] args) {
int my_input, my_temp, my_remainder, my_result;
my_result = 0;
Scanner my_scanner = new Scanner(System.in);
System.out.print("숫자를 입력하세요 : ");
my_input = my_scanner.nextInt();
my_temp = my_input;
while (my_temp != 0) {
my_remainder = my_temp % 10; // 마지막 자릿수 추출
my_result += Math.pow(my_remainder, 3); // 세제곱 후 누적 합산
my_temp /= 10; // 마지막 자릿수 제거
}
if (my_result == my_input)
System.out.println(my_input + "은(는) 암스트롱 수입니다");
else
System.out.println(my_input + "은(는) 암스트롱 수가 아닙니다");
}
}
실행 결과
숫자를 입력하세요 : 407 407은(는) 암스트롱 수입니다
예제 2: 미리 정의된 값으로 확인하기
아래 예제는 숫자를 코드 안에서 미리 정의한 뒤, 동일한 로직으로 암스트롱 수 여부를 판별해 콘솔에 출력합니다.
public class IsArmstrong {
public static void main(String[] args) {
int my_input, my_temp, my_remainder, my_result;
my_input = 407;
my_result = 0;
System.out.println("검사할 숫자 : " + my_input);
my_temp = my_input;
while (my_temp != 0) {
my_remainder = my_temp % 10;
my_result += Math.pow(my_remainder, 3);
my_temp /= 10;
}
if (my_result == my_input)
System.out.println(my_input + "은(는) 암스트롱 수입니다");
else
System.out.println(my_input + "은(는) 암스트롱 수가 아닙니다");
}
}
실행 결과
검사할 숫자 : 407 407은(는) 암스트롱 수입니다
코드 동작 원리 살펴보기
입력값이 153일 때 while 반복문이 어떻게 동작하는지 단계별로 살펴보겠습니다.
- 1회전: 153 % 10 = 3 → 3³ = 27 → my_result = 27, my_temp = 15
- 2회전: 15 % 10 = 5 → 5³ = 125 → my_result = 152, my_temp = 1
- 3회전: 1 % 10 = 1 → 1³ = 1 → my_result = 153, my_temp = 0
반복이 종료된 후 my_result(153)와 my_input(153)이 같으므로 153은 암스트롱 수로 판별됩니다.
마무리
이처럼 나머지 연산자(%)와 나눗셈(/)만 활용하면 별도의 문자열 처리 없이도 각 자릿수를 손쉽게 분리할 수 있습니다. Math.pow() 대신 my_remainder * my_remainder * my_remainder처럼 직접 곱하는 방식을 사용하면 성능 면에서 더 유리합니다. 또한 4자리 이상의 수를 검사하려면 세제곱 대신 자릿수에 맞는 거듭제곱을 적용하도록 코드를 확장하면 됩니다.