Study hard
(c++)백준 1676번: 팩토리얼 0의 개수 본문
https://www.acmicpc.net/problem/1676
1676번: 팩토리얼 0의 개수
N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
[풀이]
팩토리얼을 일일이 구하면 어느 순간 기하급수적으로 커지기 때문에 한계가 있다.
팩토리얼을 구하면서 10이 몇번 곱해지는 지를 구하면 된다.
1부터 N까지 for문을 돌리면서 각 수에 2와 5가 몇 개씩 포함되어 있는지 센다.
더 적은 개수가 2 * 5(10)의 개수이다.
ex)12 1, 2, 3, 4(2 * 2), 5, 6(2 * 3), 7, 8(2 * 2 * 2) , 9, 10(2 * 5), 11, 12(2 * 2 * 3) 2 개수 : 10개 5 개수 : 2개 2 * 5(10)의 개수 : 2개 |
그냥 5의 개수 구해도 될 듯하다
#include <iostream>
using namespace std;
int N;
long long getCnt(int num, int m) {
long long cnt = 0;
while (num%m == 0) {
cnt++;
num /= m;
}
return cnt;
}
void solution() {
cin >> N;
long long Mo2 = 0;//2의 배수 개수
long long Mo5 = 0;//5의 배수 개수
if (N == 0) {
cout << 0 << endl;
return;
}
//팩토리얼 안에 2 * 5가 몇 쌍 있는지 찾기
for (int i = 1; i <= N; i++) {
if (i % 2 == 0)
Mo2 += getCnt(i, 2);
if (i % 5 == 0)
Mo5 += getCnt(i, 5);
}
//2와 5의 개수 중 더 적은 수가 2 * 5인 쌍의 수
if (Mo2 < Mo5)
cout << Mo2 << endl;
else
cout << Mo5 << endl;
}
int main() {
solution();
return 0;
}
'백준 > 여러가지 문제들' 카테고리의 다른 글
(c++)백준 13458번: 시험 감독 (0) | 2020.10.16 |
---|---|
(c++)백준 2004번: 조합 0의 개수 (0) | 2020.06.18 |
(c++)백준 10872번: 팩토리얼 (0) | 2020.06.18 |
(c++)백준 11653번: 소인수분해 (0) | 2020.06.18 |
(c++)백준 6588번: 골드바흐의 추측 (0) | 2020.06.18 |