Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 숫자의 재귀적 자릿수 합이 소수인지 판별하는 방법

정수 변수 number가 입력으로 주어졌을 때, 이 숫자의 각 자릿수를 더한 값을 구하고, 그 합이 소수(prime)인지 아닌지를 확인하는 것이 목표입니다. 단, 자릿수 합이 한 자리 숫자가 될 때까지 반복해서 더해야 하며, 최종적으로 얻어진 한 자리 숫자가 소수인지를 판별합니다.

예를 들어 입력값이 123이라면 자릿수의 합은 1+2+3=6입니다. 6은 이미 한 자리 숫자이므로 반복을 멈추고, 6은 소수가 아니므로 'NOT PRIME'을 출력하게 됩니다.

입력 및 출력 시나리오 살펴보기

입력 − number = 12341

출력 − 숫자의 재귀적 자릿수 합은 소수(PRIME)입니다

설명

1+2+3+4+1 = 11

1+1 = 2

2는 소수입니다.

입력 − number = 1664

출력 − 숫자의 재귀적 자릿수 합은 소수가(NOT PRIME) 아닙니다

설명

1+6+6+4 = 17

1+7 = 8

8은 소수가 아닙니다.

프로그램에 적용된 접근 방식

  • 정수형 변수 number를 선언합니다.

  • 데이터를 Recursively_Prime(number) 함수에 전달합니다.

  • Recursively_Prime(number) 함수 내부에서:

    • sum(number) 함수를 호출한 결과를 number에 다시 저장합니다.

    • number가 2, 3, 5 또는 7이라면 'PRIME'을 출력합니다.

    • 그렇지 않다면 'NOT PRIME'을 출력합니다.

  • sum(int number) 함수 내부에서:

    • number가 0이면 0을 반환합니다.

    • 그렇지 않고 number % 9가 0이면 9를 반환합니다.

    • 위 조건에 해당하지 않으면 number % 9를 반환합니다.

  • 결과를 출력합니다.

여기서 핵심은 디지털 루트(digital root) 개념입니다. 어떤 수의 자릿수를 한 자리 숫자가 될 때까지 반복해서 더하면, 그 결과는 항상 'number % 9'와 같아집니다(단, 9의 배수일 경우 9). 따라서 복잡한 반복문 없이도 모듈로 연산만으로 재귀적 자릿수 합을 즉시 구할 수 있습니다. 한 자리 소수는 2, 3, 5, 7뿐이므로, 디지털 루트가 이 네 값 중 하나인지만 확인하면 됩니다.

예제 코드

#include<iostream>
using namespace std;
int sum(int number){
   if(number == 0){
      return 0;
   }
   else{
      if(number % 9 == 0){
         return 9;
      }
      else{
         return number % 9;
      }
   }
}
void Recursively_Prime(int number){
   number = sum(number);
   cout<<"Recursive sum of digits of a number is ";
   if(number == 2 || number == 3 || number == 5 || number == 7){
      cout << "PRIME";
   }
   else{
      cout << "NOT PRIME";
   }
}
int main(){
   int number = 5555;
   Recursively_Prime(number);
}

출력 결과

위 코드를 실행하면 다음과 같은 출력이 생성됩니다.

Recursive sum of digits of a number is PRIME

입력값 5555의 경우 자릿수 합은 5+5+5+5=20이고, 다시 2+0=2가 되어 한 자리 숫자 2에 도달합니다. 2는 소수이므로 'PRIME'이 출력되는 것입니다.