카테고리 없음

[C] 백준 1676 (팩토리얼 0의 개수)

감조자림 2023. 4. 20. 01:39

N!값의 뒤에서 부터 (일의 자리 수 부터) 처음으로 0이 아닌 수가 나올 때까지 0의 개수를 세면 된다.

예를 들어, 5! = 120, 제일 뒤에 0이 한 개 있으므로 5가 입력으로 주어진 경우 1을 출력하면 된다.
10! = 3628800, 뒤에 0이 두 개 있으므로 10이 입력으로 주어진 경우는 2를 출력하면 된다.

제일 뒤에 0의 개수가 몇 개 있는지는 어떻게 알 수 있을까?
N!의 값을 소인수분해 했을 때, 2X5가 몇 개 있는지가 0의 개수와 동일하다. 
예를 들어, 5!의 경우 1X2X3X4X5 이므로 소인수분해 하면 2가 3개, 5가 1개이므로 2X5는 1개 만들어지고, 정답도 1이다.
10!의 경우 마찬가지 방식으로 계산해보면 2가 8개, 5가 2개이므로 2X5는 2개 만들어지고, 정답도 2이다.
그럼 2로 몇 번 나누어 떨어지고, 5로 몇 번 나누어떨어지는지 계산한 다음 둘 중 작은 값을 출력하면 될까?
그럴 필요는 없다. 2의 개수보다 5의 개수가 작을테니 5의 개수만 보면 된다. 

5가 몇 번 들어가냐는 것은 5의 배수가 몇 번 들어가냐는 말이고, 따라서 n을 5로 나눈 몫을 구하면 된다.
한 가지 주의할 점은 25, 50, 125, 250 처럼 한 숫자에 5가 2개 이상 들어가는 경우에는 한 번 씩 더 세어줘야 한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	int n; scanf("%d", &n);	
	int five;
	five = n / 5;
	five += n / 25;
	five += n / 125;
	printf("%d", five);
}