본문 바로가기

Algorithm

[백준] 1676. 팩토리얼 0의 개수 - JAVA

문제

 

 


 

 

풀이

 

큰 숫자의 팩토리얼 (n!) 값을 구하는 것으로 기존 int, long, double 등 사용이 불가능하다.

따라서 BigInteger 를 사용해야한다.

BigInteger의 특이한 점은 문자열이라는 점이다.

따라서 자바 내장되어있는 함수를 사용해야한다.

 

BigInteger big1= new BigInteger("1");

BigInteger big2 = BigInteger.valueOf(2);

이때 두개의 차이점은, big1은 문자열 파싱으로 생성된 것이고,

big2 는 원시타입인 long값을 받아서 생성한 것이다.

이를 활용하여 Type이 BigInteger 끼리 연산은 아래와 같다.

 

더하기 : big1.add( big2 );

빼기 : big1.subtract( big2 );

곱하기 : big1.multiply( big2 );

나누기 : big1.divide( big2 );

나머지 : big2.remiander( big2 );

 

이를 응용하여 문제를 풀어보자.

 


코드

 

import java.io.*;
import java.math.*;

 

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter pw = new PrintWriter(System.out);
        BigInteger big1 = new BigInteger("1");
        int N = Integer.parseInt(br.readLine());
        int cnt = 0;

 

        for(int i=2; i<=N; i++){
            BigInteger mul = BigInteger.valueOf(i);
            big1 = big1.multiply(mul);
        }
        String str = big1.toString();
        for(int i=str.length()-1; i>=0; i--){
            int A = (int)str.charAt(i)-'0';
            if(0 == A){
                cnt++;
            }
            else{
                break;
            }
        }
        pw.print(cnt);
        pw.flush();
        pw.close();
        br.close();
    }
}

 

원시 타입인 long으로 받아 생성하여

for문에서 i값을 이용하였다.

그리고 .multiply를 사용해서 팩토리얼 연산을 완성 시켰다.

 

그 후 BigInterger를 String 타입으로 변환 시켜 준 후

뒤에서부터 문자를 Int 타입으로 변한 후 

0과 비교하여, 성공시 다음으로 넘어가며 카운트 증가,

실패시 바로 멈추게 구현했다.


GitHub