Algorithm/math
[백준] 알고리즘 C++ 1676번 - 팩토리얼 0의 개수문제
낭강
2021. 11. 10. 17:35
문제
https://www.acmicpc.net/problem/1676
1676번: 팩토리얼 0의 개수
N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
소스코드
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int main() {
ios_base::sync_with_stdio(false), cin.tie(NULL);
int n, count = 0;
cin >> n;
for (int i = 2; i <= n; i++) {
if (i % 5 == 0) count++;
if (i % 25 == 0) count++;
if (i % 125 == 0) count++;
}
cout << count;
}
해설
long long num = fact(n);
for (int i = 2; i <= n; i++) {
while (num % i == 0) {
if (i == 5) count++;
num /= i;
}
}
팩토리얼 계산된 num을 가지고 소인수분해를 진행하게 되면 시간초과가 나게된다.
우리는 좀 더 효율적인 계산 방법을 찾아내야한다.
2, 5를 곱하여 10을 만들면 끝자리 수가 0으로 되게됩니다.
5가 2보다 나올 개수가 더 작기때문에 5만 구해서 갯수를 출력해주면 된다.
굳이 팩토리얼을 계산하지 않고도
100! = 1 2 3 4 5 6 7 8 9 10 11 12 13 * * * 100 100까지의 숫자중 5의 제곱수마다 5가 들어가져있습니다.
그렇다면 2부터 n까지 숫자들중 5가 들어있나 확인하면됩니다.
결국 이말이 n! 에서 5를 찾는 것과 같습니다.
5의 제곱수를 주의해야하는데요
5 25 125
25는 5가 2개들어가있고
125는 5가 3개들어가있습니다.
즉 n은 500아래까지 나올 수 있는 5의 제곱수 최대값인 125까지 생각만 해주면됩니다.