이번 문제는 팩토리얼과 관련된 문제이다.
팩토리얼은 기본적으로 큰 수이기 때문에, 일일히 확인하는 방식은 옳지 않다.
맨 처음으로 생각한건 10으로 나눴을때 나머지가 0인걸 생각했는데,
10은 2와 5의 곱셈으로 이루어지고, 2의 배수보다는 5의 배수가 더 적으니 5의 배수인 것의 수를 세서 0의 개수를 확인할 수 있을 것 같다고 생각했다.
그래서 5의 배수 , 25의 배수, 125의 배수일때 수를 세는 것으로 알고리즘을 짰다. (125까지인 이유는 입력이 500 이하의 값이기 때문에!)
#include <iostream>
#include <cstdio>
using namespace std;
int main(void)
{
int a;
int result = 0;
scanf("%d", &a);
for (int i = 2; i <= a; i++)
{
if (i % 5 == 0)
result++;
if (i % 25 == 0)
result++;
if (i % 125 == 0)
result++;
}
printf("%d", result);
return 0;
}
그런데, 코드플러스 강의를 듣고 다시 보니까 좀더 코드가 짧은 방식으로도 문제를 풀 수 있더라... (위의 알고리즘도 맞음! 다만 아래 코드가 더 짧고, 좋은 것 같으므로 같이 적어본다.
int main(void)
{
int ans = 0;
int n;
scanf("%d", &n);
for (int i =5; i<= n; i*= 5){
ans += n/i;
}
printf("%d", ans);
return 0;
}
둘다 5의 배수를 활용하는 것은 같지만, 어떻게 더 효율적으로 코드를 짤 수 있는가가 달라지는 것 같다..
생각한 아이디어를 더 효율적으로, 코드로 구현하는 방법을 계속 공부해야지..!
'백준 문제풀이' 카테고리의 다른 글
숨바꼭질6 _ 백준 17087 (0) | 2020.05.20 |
---|---|
GCD 합 _ 백준 9613 (0) | 2020.05.18 |
골드바흐의 추측 _ 백준 6588 (0) | 2020.05.17 |
소수 찾기 / 소수 구하기 _ 백준 1978,1929 (0) | 2020.05.16 |
최대공약수/ 최소공배수_ 백준 2609번/1934번 (0) | 2020.05.16 |