[백준 / C언어] 1564번 문제

Estelle·2023년 9월 21일

백준 C/C++언어

목록 보기
7/16

문제

팩토리얼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자리숫자로 제한하면 되는 것 이였다.

쉬운 문제였는데 반례를 찾고나서 생각이 틀렸다는 것을 알게되는게 어려웠던 문제ㅠ

profile
I have prepared for My Life long 🌙

0개의 댓글