정수 변수 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'이 출력되는 것입니다.