728x90
🏆 목차.
🛒 문제
🎨 코드
#include<iostream>
using namespace std;
int main()
{
int N;
cin >> N;
int count = 0;
for (int i = 5; i <= N; i *= 5) {
count += N / i;
}
cout << count << endl;
return 0;
}
🎯 풀이
문제 팩토리얼 0의 개수는 팩토리얼의 결과로 나오는 값의 뒤에 0이 몇 개 붙어있는지 알아내는 문제이다.
만약 팩토리얼의 결과로 xxxx000이 나오면 3을 출력하고 xxx0x00이 나오면 2를 출력하는 방식이다.
팩토리얼을 하나하나 계산하는 방식으로 풀 수 있지만 너무 비효율 적이다.
0이 몇 개 인지 알아내기위해 N! 를 소인수 분해했을 때, 2와 5가 몇 개 나오는지 알면 되는데,
5의 개수가 항상 2의 개수 보다 적기 때문에, 5의 개수만 세어주면 됩니다.
5의 개수는 입력된 값을 5로 나누어보면 됩니다.
만약 100!이 입력된다면, 100 / 5로 20이 나오고, 5가 중복되는 25, 50, 75, 100까지 총 4개
합은 24가 나오는 방식입니다.
for (int i = 5; i <= N; i *= 5) {
count += N / i;
}
위 반복문을 통해 N / i를 한 값을 count에 더해주고
i를 5 곱해줍니다.
첫 반복때 100 / 5로 count에는 20이 들어갑니다.
두 번째 반복 때 100 / 25로 count에는 24가 들어갑니다.
결과적으로 정답은 24가 됩니다.
728x90
'코딩테스트' 카테고리의 다른 글
[C++][DP] 백준 11726번 : 2xn 타일링 (1) | 2023.10.19 |
---|---|
[C++][DP] 백준 1463번 : 1로 만들기 (0) | 2023.10.14 |
[C++][Stack] 백준 10799번 : 쇠막대기 (1) | 2023.10.03 |
[C++][Deque] 백준 10866번 : 덱 (0) | 2023.10.02 |
[C++][Queue] 백준 1158번 : 요세푸스 문제 (0) | 2023.10.02 |