숫자 'n'이 주어졌을 때, 이 숫자가 스트롱 넘버(Strong Number)인지 아닌지 판별해야 합니다.
스트롱 넘버란 각 자릿수의 팩토리얼 값을 모두 더한 합이 원래 숫자 'n'과 같아지는 수를 말합니다. 여기서 팩토리얼(factorial)은 어떤 수부터 1까지의 모든 정수를 곱한 값을 의미하며, 느낌표(!) 기호로 나타냅니다. 예를 들어 4! = 4×3×2×1 = 24입니다.
따라서 어떤 수가 스트롱 넘버인지 확인하려면 그 수의 모든 자릿수를 하나씩 추출해야 합니다. 예를 들어 숫자가 145라면 1, 4, 5를 각각 뽑아낸 후, 각 숫자의 팩토리얼을 구합니다. 즉, 1! = 1, 4! = 24, 5! = 120입니다.
이제 1 + 24 + 120을 더하면 145가 되는데, 이는 입력값과 정확히 일치합니다. 따라서 145는 스트롱 넘버라고 할 수 있습니다.
예시
입력: n = 124 출력: 아니요, 스트롱 넘버가 아닙니다 설명: 1! + 2! + 4! = 27로 n(124)과 같지 않습니다 입력: n = 145 출력: 네, 스트롱 넘버입니다 설명: 1! + 4! + 5! = 145
문제 해결 접근 방식
이 문제는 다음과 같은 방법으로 해결할 수 있습니다.
- 일의 자리부터 시작하여 각 자릿수를 하나씩 가져오고, 해당 자릿수의 팩토리얼을 구합니다.
- 구한 각 자릿수의 팩토리얼 값을 모두 더합니다.
- 결과값을 원래 숫자와 비교합니다. 두 값이 같으면 스트롱 넘버이고, 그렇지 않으면 스트롱 넘버가 아닙니다.
알고리즘
START
함수 int factorial(int r)
Step1 -> int fact를 선언하고 1로 초기화
Step2 -> r > 1인 동안 반복
fact를 fact * r로 설정
r을 1씩 감소
End Loop
Step3 -> fact 반환
factorial 함수 종료
함수 int check(int n)
Step1 -> int temp, rem, result를 선언하고 result를 0으로 초기화
Step2 -> temp를 n으로 설정
Step3 -> temp가 참인 동안 반복
rem을 temp % 10으로 설정
result를 result + factorial(rem)으로 설정
temp를 temp / 10으로 설정
End loop
Step4 -> 만약 result == n이라면,
1 반환
Step5 -> 아니면
0 반환
check 함수 종료
main(int argc, char const *argv[])
Step1 -> n을 선언하고 145로 초기화
Step2 -> 만약 check(n)이 참이라면,
"Yes it is a strong number" 출력
Step3 -> 아니면
"no it is not a strong number" 출력
STOP예제 코드
#include <stdio.h>
int factorial(int r) {
int fact = 1;
while(r>1) {
fact = fact * r;
r--;
}
return fact;
}
int check(int n) {
int temp, rem, result = 0;
temp = n;
while(temp) {
rem = temp % 10;
result = result + factorial(rem);
temp = temp/10;
}
if (result == n)
return 1;
else
return 0;
}
int main(int argc, char const *argv[]) {
int n = 145;
if (check(n))
printf("Yes it is a strong number\n");
else
printf("no it is not a strong number\n");
return 0;
}위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Yes it is a strong number