![[APS][C++] BOJ S5 1676번 팩토리얼 0의 개수 (feat. 0의 개수의 비밀)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbtUAO5%2FbtsMcy3C9v8%2FAAAAAAAAAAAAAAAAAAAAAFXEPryiXvsXyS1Zf-LR5-hgQ8ee3TpYwfpBDzHO4bUn%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1751295599%26allow_ip%3D%26allow_referer%3D%26signature%3DpzjhbbTzI6epB4FoDU7Pg3rp918%253D)
[APS][C++] BOJ S5 1676번 팩토리얼 0의 개수 (feat. 0의 개수의 비밀)📖 APS/BOJ2025. 2. 9. 20:58
Table of Contents
https://www.acmicpc.net/problem/1676
문제
$ N! $ 에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.
입력
- 첫째 줄에 N이 주어진다. (0 ≤ N ≤ 500)
출력
- 첫째 줄에 구한 0의 개수를 출력한다.
풀이
$ N! $ 에서 0의 개수는 5의 지수(소인수로서 5가 총 몇번 곱해졌는지)를 확인하면 된다.
- 연속된 0의 개수는 팩토리얼의 소인수 분해에서 10이 몇 번 곱해졌는지에 따라 변화함
- 10은 2와 5가 각각 하나씩 모일 때마다 만들어지기 떄문에 소인수로서 5가 총 몇 개가 있느냐에 따라 결정됨 (2는 모든 짝수의 소인수이기 때문에 소인수로서 2는 5보다 무조건 많을 수 밖에 없음)
- 아래 수식을 코드로 구현하면 해결이 가능함
$$ \left\lfloor \frac{n}{5} \right\rfloor + \left\lfloor \frac{n}{5^2} \right\rfloor + \left\lfloor \frac{n}{5^3} \right\rfloor + \cdots $$
코드
#include <cmath>
#include <iostream>
using namespace std;
int main() {
int N;
cin >> N;
int cnt = 0;
for (int i = 1; i < 4; i++) {
cnt += N / int(pow(5, i));
}
cout << cnt;
return 0;
}
결과
오답 원인
- 처음에는 위 규칙이 아니라 팩토리얼을 모두 계산한 후 0을 세는 방식으로 작성했더니 C++에서 표현할 수 있는 수의 범위를 넘어갔기 떄문에 오답이 출력됨 (오버플로우로 인한 오류)
- 따라서 오버플로우를 방지하기 위해 다른 방법이 필요하였으며, 위 코드를 통해 해결
'📖 APS > BOJ' 카테고리의 다른 글
[APS][C++] BOJ S1 2529번 부등호 (0) | 2025.03.12 |
---|---|
[APS][C++] BOJ S5 11723번 집합 (feat. 입출력 시간 초과) (0) | 2025.02.16 |
[APS][C++] BOJ B2 1152번 단어의 개수 (feat. getline) (0) | 2025.01.30 |
[APS][C++] BOJ B5 10951번 A+B - 4 (feat. EOF) (0) | 2025.01.28 |
[APS][C++] BOJ B5 2741번 N 찍기 (feat. 시간 초과) (0) | 2025.01.28 |
@청월누리 :: DevKuk 개발 블로그
since 2025.01.27. ~ 개발자를 향해....🔥