-
백준 1676 - 팩토리얼 0의 개수백준 algorithm 2019. 9. 29. 14:16반응형
문제풀이 : 예를 들어 111533400 이라는 숫자가 있다고 하면 뒤에서부터 0이 아닌 숫자가 나올때까지 0의 숫자를 세는 문제이다. 이 경우에 0의 개수는 2개이다.
첫번째 풀이 : 실제로 n!을 계산하여 하려고 하였지만, 범위를 한참 벗어나서 구하지 못하였다.
두번째 풀이 : 소인수 분해를 하여 2*5의 갯수에 따라 0의 갯수가 정해지는 것을 깨달았다.
그래서 곱해지는 숫자마다마다를 소인수 분해하여 2의 갯수와 5의 갯수를 각각 구했다.10 = 2*5 => 2(1개) 5(1개)
위와 같은 방식으로 팩토리얼 계산시 곱해지는 수들의 소인수중 2와 5의 개수를 구하였다.
2와 5가 하나씩 짝을 이루어야 0이 되므로 2의 개수와 5의 개수중 최소값을 구하면 되는 문제이다.*알고리즘은 쉽게 짰으나, 코딩에서 시간이 걸렸다.
#include <iostream> #include <math.h> #include <algorithm> using namespace std; int two_detec(int n) { int cnt = 0; while (n%2==0) { cnt++; n = n / 2; } return cnt; } int five_detec(int n) { int cnt = 0; while (n%5==0) { cnt++; n = n / 5; } return cnt; } int main() { int N; int Limit; int cnt = 0;//0의 갯수 cin >> N; Limit = N; int two = 0; int five = 0; for (int i = Limit; i > 1; i--) { two += two_detec(i); five += five_detec(i); } cnt = min(two, five); cout << cnt; return 0; }
반응형'백준 algorithm' 카테고리의 다른 글
백준 10869 - 사칙연산 (0) 2019.10.02 백준 2798 - 블랙잭 (0) 2019.10.02 백준 2581 - 소수 (0) 2019.09.27 백준 10773 - 제로 (0) 2019.09.25 백준 2739 - 구구단 (0) 2019.09.25