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

함수를 활용해 구간 사이의 암스트롱 수를 찾아 출력하는 Java 프로그램

암스트롱 수란 무엇인가?

이 글에서는 함수를 활용하여 주어진 구간 사이의 암스트롱 수(Armstrong Number)를 찾아 출력하는 Java 프로그램을 단계별로 살펴봅니다. 암스트롱 수란 각 자릿수의 세제곱을 모두 더한 값이 그 수 자신과 같은 수를 의미합니다.

조금 더 일반적으로 설명하면, 어떤 정수의 모든 자릿수를 분리하여 각각 세제곱한 뒤 합산했을 때 원래의 수와 같다면 그 수를 암스트롱 수라고 합니다. 즉, abcd... = a³ + b³ + c³ + d³ + ... 의 관계가 성립하는 수입니다.

특히 3자리 수의 경우, 각 자릿수의 세제곱의 합이 수 자신과 정확히 일치합니다. 대표적인 예로 153과 371이 있습니다.

153 = 1³ + 5³ + 3³

또 다른 예인 371도 마찬가지입니다.

371 = 3³ + 7³ + 1³ = 27 + 343 + 1

입력 및 출력 예시

입력

두 개의 정수 1과 500을 입력한다고 가정해 보겠습니다.

두 개의 입력값 : 1과 500

출력

그러면 프로그램은 아래와 같은 결과를 출력합니다.

The Armstrong numbers are:
153 370 371 407

알고리즘

  1. 프로그램을 시작합니다.
  2. 정수형 변수 my_low(시작 값), my_high(끝 값), i를 선언합니다.
  3. 사용자로부터 필요한 값을 입력받거나 값을 직접 정의합니다.
  4. 정수 하나를 매개변수로 받아 boolean 값을 반환하는 IsArmstrong 함수를 정의합니다.
  5. 함수 내부에서 입력값을 10으로 나눈 나머지를 구해 저장합니다.
  6. 구한 나머지(my_rem)를 세 번 곱한 값을 my_sum에 누적합니다.
  7. check 변수를 10으로 나눈 몫으로 갱신하며 반복하고, 반복이 끝나면 my_sum과 입력값 i를 비교하여 true 또는 false를 반환합니다.
  8. for 루프를 사용해 my_low부터 my_high까지 반복하면서 각 숫자마다 IsArmstrong 함수를 호출합니다. true가 반환되면 해당 숫자를 저장합니다.
  9. 결과를 화면에 출력합니다.
  10. 프로그램을 종료합니다.

예제 1: 사용자 입력을 받아 처리하기

아래 예제에서는 Scanner 객체를 사용해 사용자로부터 시작 값과 끝 값을 직접 입력받은 뒤, 해당 구간 내의 암스트롱 수를 찾아 출력합니다.

import java.util.Scanner;
public class ArmstrongNumbers {
   public static void main(String[] args) {
      int my_low, my_high, i;
      Scanner my_scanner = new Scanner(System.in);
      System.out.println("Required packages have been imported");
      System.out.println("A scanner object has been defined ");
      System.out.println("Enter the first number :");
      my_low = my_scanner.nextInt();
      System.out.println("Enter the limit :");
      my_high = my_scanner.nextInt();
      System.out.println("The Armstrong numbers are :");
      for(i = my_low + 1; i < my_high; ++i) {
         if (IsArmstrong (i))
            System.out.print(i + " ");
      }
   }
   public static boolean IsArmstrong(int i) {
      int check, my_rem, my_sum;
      my_sum = 0;
      check = i;
      while(check != 0) {
         my_rem = check % 10;
         my_sum = my_sum + (my_rem * my_rem * my_rem);
         check = check / 10;
      }
      if(my_sum == i){
         return true;
      }
      return false;
   }
}

실행 결과

Required packages have been imported
A scanner object has been defined
Enter the first number :
1
Enter the limit :
500
The Armstrong numbers are :
153 370 371 407

예제 2: 값을 미리 정의해서 처리하기

아래 예제에서는 시작 값과 끝 값을 코드 안에서 미리 정의하고, 별도의 입력 없이 콘솔에 바로 결과를 출력합니다. 테스트나 학습용으로 간편하게 활용할 수 있는 방식입니다.

public class ArmstrongNumbers {
   public static void main(String[] args) {
      int my_low, my_high, i;
      my_low = 1;
      my_high = 500;
      System.out.println("The starting and ending numbers are defined as " + my_low + " and " + my_high);
      System.out.println("The Armstrong numbers are :");
      for(i = my_low + 1; i < my_high; ++i) {
         if (IsArmstrong (i))
            System.out.print(i + " ");
      }
   }
   public static boolean IsArmstrong (int i) {
      int check, my_rem, my_sum;
      my_sum = 0;
      check = i;
      while(check != 0) {
         my_rem = check % 10;
         my_sum = my_sum + (my_rem * my_rem * my_rem);
         check = check / 10;
      }
      if(my_sum == i){
         return true;
      }
      return false;
   }
}

실행 결과

The starting and ending numbers are defined as 1 and 500
The Armstrong numbers are :
153 370 371 407

핵심 정리

IsArmstrong 함수는 숫자를 한 자릿수씩 분해하며(% 연산자로 나머지 추출, / 연산자로 자릿수 이동) 각 자릿수의 세제곱을 누적합산합니다. 최종적으로 누적된 합계가 원래 숫자와 일치하면 true를 반환하는 방식입니다. 이처럼 판별 로직을 별도의 함수로 분리하면 코드의 재사용성과 가독성이 크게 향상되며, 구간 검색 로직과 독립적으로 테스트할 수 있다는 장점이 있습니다.