팩토리얼5란, N!의 0이 아닌 뒤 5자리를 말한다.
N이 주어졌을 때, 팩토리얼5를 구하는 프로그램을 작성하시오.
첫째 줄에 정수 N이 주어진다. N은 1,000,000보다 작거나 같다. 또, 9보다 크거나 같다.
첫째 줄에 N의 팩토리얼5를 계산한다.
#include <stdio.h>
int main(void) {
int N;
scanf("%d", &N);
long long int result = 1;
for (int i = 2; i <= N; i++) {
result *= i;
while (result % 10 == 0) {
result /= 10;
}
result %= 1000000000000;
}
result %= 100000;
printf("%05lld\n", result);
return 0;
}
여기서 생긴 문제점은 크게 2가지였다.
1. int가 아닌 long long int 형을 사용해야한다는 점 (N의 범위값 때문에)
2. 팩토리얼에서 0을 제거하는 것 까지는 맞았지만, 뒤에서 5번째 숫자끼리만 곱하면 반례가 나온다는 것을 알지 못했다.
초기에는 뒤에서 5번째 숫자들끼리만 곱해서 int 의 범위값을 넘어가는 것을 방지하려고 했지만 그렇게 할 경우에는 후에는 반례가 나온다는 것을 알게되었다. (Ex: 15!)
그렇기때문에 넉넉한 숫자로 result를 설정한 뒤, 나중에 팩토리얼이 끝난 뒤 5자리숫자로 제한하면 되는 것 이였다.
쉬운 문제였는데 반례를 찾고나서 생각이 틀렸다는 것을 알게되는게 어려웠던 문제ㅠ