백준/c

백준_1676_팩토리얼0의개수

S0LL 2024. 5. 4. 13:00

 

 

팩토리얼에서 맨 뒤에서부터 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 문제입니다.

 

문제가 잘 이해가 안되실 수 있으니 (제가 그랬습니다..) 예시를 보여드리겠습니다.

 

더보기

5! = 5*4*3*2*1 = 120 -> 1개

 

6! = 6*5*4*3*2*1 = 720 -> 1개

 

7! =  7*6*5*4*3*2*1 = 5040 -> 1개

 

8! =  8*7*6*5*4*3*2*1 = 40320 -> 1개

 

9! =  9*8*7*6*5*4*3*2*1 = 362880 -> 1개

 

10! = 10*9*8*7*6*5*4*3*2*1  = 3628800 -> 2개

어떤 숫자의 맨 뒤에 0이 오기 위해서는 반드시 10이 곱해져야 합니다.

10 = 2*5 이므로, 2와 5의 개수를 찾으면 0의 개수 또한 구할 수 있겠죠.

 

하지만, 여기서 생각해봐야 할게 한가지 더 있습니다.

 

굳이 2의 개수를 세야 할까? 라는 의문입니다.

 

4=2^2 , 8=2^2  . . . . 이와 같이 2의 거듭제곱꼴은 많고도 많습니다.

 

5의 개수와 비교하자면 훨씬 말이죠.

 

그럼 5의 개수만 세면 2의 개수는 충분하니 자동으로 10이 되게 할 수 있지 않을까요?

 

따라서 저희는 5의 개수만 찾으면 됩니다.

 

위 예시에서도 볼 수 있듯, 5의 개수(5의 배수의 개수 포함)가 뒤의 0의 개수와 일치하다는 것을 확인할 수 있습니다.

 

그럼 이 규칙이 큰 숫자에서도 적용될까요?

 

25! = 15511210043330985984000000

으로 뒤에 0이 6개입니다. 왜 그럴까요?

25 는 5의 거듭제곱꼴이기 때문입니다. 

따라서, 뒤에 0이 몇개인지 구하기 위해서는 5의 배수뿐 아니라 5의 거듭제곱의 배수가 몇개 있는지 세주면 됩니다.

 

 

 

전체 코드)

#include <stdio.h>

int main(void)
{
    int N = 0;
    scanf("%d", &N);

    int count = 0;
    for (int i = N; i >= 1; i--)
    {
        if (i % 5 == 0)
        {
            count++;
        }

        if (i % 25 == 0)
        {
            count++;
        }

        if (i % 125 == 0)
        {
            count++;
        }
    }
    printf("%d\n", count);
    return 0;
}

'백준 > c' 카테고리의 다른 글

백준_12789_도키도키간식드리미  (0) 2024.05.06
백준_10773_제로_(stack)  (0) 2024.05.05
백준_1436_영화감독숌  (0) 2024.05.03
백준_10989_수정렬하기3(counting sort)  (0) 2024.05.03
백준_2903_중앙이동알고리즘  (2) 2024.05.03