알고리즘/it 취업을 위한 알고리즘 문제풀이
28. N!에서 0의 개수
고줭
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의 갯수보다 적을일은 없을거라 생각되는데 혹시나 있는 경우를 알고계시다면 댓글에 써주세요.