틀린 코드
:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
if (N <=3)
{
System.out.println(0);
return;
}
double fac = 1;
for (int i = 1; i <= N; i++)
{
fac *= i;
}
String fac2 = String.valueOf(fac);
char[] num = new char[fac2.length()];
double[] num2 = new double[fac2.length()];
for (int i = 0 ; i < fac2.length(); i++)
{
num[i] = fac2.charAt(i);
num2[i] = (double) num[i]-'0';
}
boolean[] last_num = new boolean[fac2.length()+1];
// 10 팩토리얼 -> 3628800
for (int i =0; i < fac2.length(); i++)
{
if(num2[i] == 0)
{
last_num[i] = false;
}
if (num2[i] != 0)
{
last_num[i] = true;
}
}
for (int i = fac2.length()-1; i >=0; i--)
{
if(last_num[i])
{
System.out.println(fac2.length()-1-i);
return;
}
}
// 5! -> 120
}
}
너무 복잡하고 큰 수일겨우에는 값의 오류가 발생하여 틀린 코드이다.
숫자 마지막에 0이 몇개 들어갈려는 지 알려면 5의 제곱수를 이용하여 구하면 된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int count = 0;
for (int i = 5; i <= N; i *= 5)
{
count += N/i;
}
System.out.println(count);
}
} 이렇게 간단하게 풀리는 지 놀랐고, 50팩토리얼 같이 값이 크게 나올경우엔 일일이 풀이과정을 따라 가는 것보단 이렇게 한번에 직관적으로 식을 정립하여 구하는 것이 맞는 것 같다는 생각을 하게 되었다.