Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바로 암스트롱 수(Armstrong Number) 판별하는 프로그램 만들기


암스트롱 수란?

이 글에서는 주어진 숫자가 암스트롱 수(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은(는) 암스트롱 수입니다

알고리즘

  1. 시작합니다.
  2. my_input(입력값), my_temp(임시값), my_remainder(나머지), my_result(누적 합) 네 개의 정수 변수를 선언합니다.
  3. 사용자로부터 값을 입력받거나 값을 직접 정의합니다.
  4. %, / 연산자를 활용한 while 반복문을 실행합니다.
  5. 임시값을 10으로 나눈 나머지를 구해 마지막 자릿수를 얻습니다.
  6. 나머지를 세제곱하여 누적 합에 더합니다.
  7. 임시값을 10으로 나눠 다음 자릿수 검사를 준비합니다.
  8. 반복이 끝나면 누적 합과 입력값을 비교합니다. 두 값이 같으면 암스트롱 수이고, 그렇지 않으면 암스트롱 수가 아닙니다.
  9. 결과를 화면에 출력합니다.
  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자리 이상의 수를 검사하려면 세제곱 대신 자릿수에 맞는 거듭제곱을 적용하도록 코드를 확장하면 됩니다.