문제태그는 수학으로 되어있으며,
팩토리얼을 구해야하다보니 재귀함수의 구현도 같이 필요하다.
그리고 이런 말하기 뭐하지만...문제 지문해석이 조금 이상?어렵다....
첫번쨰 줄에 N이 주어진다.
N!의 뒷자리부터 0이 아닌 숫자가 나올 때까지, 0의 개수를 구하라
즉, N! 을 구한 뒤 N!를 문자열로 구현한 후, 뒷자리부터 0이 아닌 숫자가 나오는 자리수-1 출력하라
문제해석만 보면 조금 말이 어려웠다...
N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수...?
N!의 값을 문자열로 보았을 때, 뒷 자리부터 0이 아닌 숫자가 나올 때까지 0의 개수.
즉, 10! = 3628800 을 뒷자리부터 보면 0이 2번 나오고 0이 아닌 8이라는 숫자가 나온다.
이 때 0이 아닌 숫자가 나오기까지 0이 2번 나왔으므로 2를 출력하면 된다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.BigInteger;
public class Main{
public static void main(String[] args) throws Exception{
BufferedReader inputStr = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(inputStr.readLine());
int answer = 0;
BigInteger fc = factorial(BigInteger.valueOf(n));
String str = String.valueOf(fc);
for(int i = str.length() - 1; i >= 0; i--) {
if(str.charAt(i) == '0') {
answer++;
}else {
break;
}
}
System.out.println(answer);
}
public static BigInteger factorial(BigInteger a) {
if(a.compareTo(BigInteger.ONE) <= 0) {
return BigInteger.ONE;
}else {
return a.multiply(factorial(a.subtract(BigInteger.ONE)));
}
}
}
① input을 n이라는 변수에 저장
② n의 펙토리얼을 구하기 위해 factorial이라는 함수를 호출한다.(factorial의 대해서는 추후 따로 리뷰할게용)
③ n!의 값을 문자열로 치환 후 뒷자리부터 확인하기 위해 for문을 length()-1부터 시작
④ 0이 나오면 answer을 증가시키고, 아닌 값이 나오면 break. 한번도 없다면 선언할 때 지정한 초기값 0 출력