https://www.acmicpc.net/problem/1676
#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
int count5(int k) {
int n = k;
int count = 0;
while (1) {
if (n < 5)break;
if (n % 5 != 0) break;
if (n % 5 == 0)count++;
n = n / 5;
}
return count;
}
int main() {
int n;
cin >> n;
int k = n;
int cnt5 = 0; // k == 10,9,8......1
int cnt2 = 0;
while (1) {
if (k < 5)break;
cnt5 += count5(k);
//cnt2 += count2(k);
k -= 1;
}
//printf("5 : %d 2 : %d\n", cnt5, cnt2);
int cnt10 = 0;
cnt10 = cnt5;
if (n < 5)cnt10 = 0;
cout <<cnt10 <<endl;
return 0;
}
처음 한 생각 : 아 팩토리얼을 구해서, 0의 개수를 세면 되겠구나, 대충 long long int 쓰면 풀리겠지?
마주한 어려움 : 하다보니까 오버플로우가 나고 연산이 제대로 안되는 것 같았다.
해결 방법 : 그제서야 "생각"이라는걸 하는 나를 바라보면서, 아직 멀었구나 느끼며
규칙을 찾아서.. 5의 개수를 세면 되겠구나 하고 푼 문제
2의 개수가 항상 5의 개수보다 작은 것 같길래 예외처리 하다가 주석으로 바꿨습니다.
'코딩테스트_백준풀이' 카테고리의 다른 글
랜선 자르기 #1654 c++ 풀이 (0) | 2023.10.06 |
---|---|
수 찾기 #1920 c++ 풀이 (0) | 2023.10.05 |
영화감독 숌 #1436 c++ 풀이 (0) | 2023.10.04 |
단어정렬 #1181 c++ 풀이 (1) | 2023.10.03 |
팰린드롬수 #1259 c++ 풀이 (0) | 2023.10.03 |