N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.
첫째 줄에 N이 주어진다. (0 ≤ N ≤ 500)
🔍 스터디 하는 친구를 통해 이 문제를 풀는 훨씬 쉬운 방법을 알았다. 바로 정답은 입력값/5+입력값/25+입력값/125인 것이다. 이게 성립이 되는 이유는 위의 이유가 똑같지만 굳이 모든 값을 일일이 확인 안해도 그 숫자를 5로 나눔으로써 그 숫자까지 도달하는데 얼마나 많은 5가 필요한지 가르쳐 준다. 만약에 25의 배수인 경우에는 5가 그만큼 한번 더 있다는 것이니 한번 더 더해줌으로써 두번 세주는 것과 같은 효과가 생긴다. 이렇게 풀면 굳이 O(N)의 복잡도를 가진 연산을 할 필요가 없다.
#include <iostream>
using namespace std;
int main(){
int n, answer = 0;
//입력
cin >> n;
//n에서 하나씩 빼면서 5를 약수로 몇개 갖고 있는지 확인
while(n){
if(!(n%125)) answer+=3; //5^3이므로 +3
else if(!(n%25)) answer+=2; //5^2이므로 +2
else if(!(n%5)) answer+=1; //5^1이므로 +1
n--;
}
//출력
cout<<answer;
}
/* 훨씬 간단한 답
int main(void){
int num;
cin >> num;
cout << num/5 + num/25 + num/125;
}
*/