고줭 2021. 5. 19. 13:39

문제

자연수 N이 입력되면 N! 값에서 일의 자리부터 연속적으로 ‘0’이 몇 개 있는지 구하는 프로그 램을 작성하세요.
만약 5! = 5 × 4 × 3 × 2 ×1 = 120으로 일의자리부터 연속적된 ‘0’의 개수는 1입니다. 만약 12! = 479001600으로 일의자리부터 연속적된 ‘0’의 개수는 2입니다.

입력설명

첫 줄에 자연수 N(10<=N<=1,000)이 입력된다.

출력설명

일의 자리부터 연속된 0의 개수를 출력합니다.

입력예제

12

출력예제

2


#include <stdio.h>
#include <vector>
using namespace std;

int main(){
	//freopen("input.txt", "rt", stdin);
	int n, i, j, temp;
	scanf("%d", &n);
	vector<int> check(n+1);
	
	for(i=2; i<=n; i++){
		temp = i;
		j = 2;
		while(j <= n){
			if(temp%j == 0){
				temp = temp / j;
				check[j]++;
			} else{
				j++;
			}
		}
	}
	
	printf("%d", check[5]);
	
	return 0;
}

첨에 sum 이라는 변수에 일일이 곱한값을 넣고 while문으로 sum%10 == 0 일때 카운트를 올리는식으로 했는데 정답은 맞지만 큰수가 들어오면 int의 한계로인해 틀리게 됩니다.

전에 풀었던 문제처럼 소인수분해를 통해 2 * 5 = 10인것을 이용해서 문제를 풀면됩니다.

while(1){
	if(temp%j == 0){
		if(j == 2) count1++;
		else if(j == 5) count2++;
		temp = temp / j;
	}
}

선생님은 이렇게 j==2 이면 count1++ ,  j==5 이면 count2++ 해서

if(count1 < count2) printf("%d", count1);
else printf("%d", count2);

이런식으로 정답출력을 하셨는데
제코드와 다른점이 있다면 저는 vector 해당 인덱스에 소인수분해해서 각각 값을 카운트 한후 5가 쓰인 갯수만 출력했습니다. 직접 해보진않았지만 2가 당연히 5보다 많다고 생각되기때문인데 채점결과로는 다 백점으로 나오긴합니다. 
2의 갯수가 5의 갯수보다 적을일은 없을거라 생각되는데 혹시나 있는 경우를 알고계시다면 댓글에 써주세요.