ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 10872,1676 - 팩토리얼, 팩토리얼 0의 개수
    자료구조와 알고리즘/문제풀기 2023. 4. 10. 22:19

    팩토리얼

    public class Main {
    
        public static void main(String[] args) throws Exception {
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //스캐너보다 성능 나음
    
            int t = Integer.parseInt(br.readLine());
            Long a = fac(t);
            
    
            bw.write(a+"");
            bw.flush();
            bw.close();
    
           }
    
        private static Long fac(int t) {
            if(t ==0) return 1L;
            else return t*fac(t-1);
        }
    
    }

    팩토리얼 0의 갯수

     

    실제 팩토리얼을 계산하고 0의 갯수를 세보면 편하겠지만.. 그럴 수 없다

    팩토리얼은 조금만 숫자가 커져도 계산하는데 시간이 너무 오래걸린다.

     

    -해결방법

     1. 소인수분해 

      뒤에 0이 생기려면, 소인수 중에서 2와 5가 곱해져야함 따라서 2와 5가 몇번 곱해졌는지 

    찾을 수 있으면, 0의 갯수를 구할 수 있을 것이다.

    가령 8이라면 8! = 8*7*6*5*4*3*2*1 을 소인수 분해하면, 2*5가 하나이므로 8!의 0의 갯수는 1개

            10이라면, 10! = 10*9*8...*1  10이 2*5이므로 2*5가 두개 10!은 0이 두개

    소인수분해하면 2가 5보다 많으므로, 5의 갯수만 카운트하면 된다.

    하지만 값이 커질 수 록 소인수분해를 해서 2와 5를 찾는과정은 시간도 많이걸리고 복잡할 것이다.

     

    2. n/5,+ n/5^2 

     

    5의 갯수만 카운트하는 것이라면, n!중에서 5를 인수로 가진 숫자를 세어주면 그만이다.

    5를 인수로 가지고 있다는 것은 5의 배수라는 이야기! 

    전체를 5로 나누어주면 된다.

    이 때 5의 N승의 숫자들은 (25,125..) 5를 두개 혹은 세개씩 가지고 있으므로 이를 인수로 가지고 있는 숫자들도 카운트 해줘야한다. 따라서 

    n!의 0의 갯수는  n/5+n/5^2+n/5^3..로 계산할 수 있다.

     

    public class Main {
    
        public static void main(String[] args) throws Exception {
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //스캐너보다 성능 나음
    
            int t = Integer.parseInt(br.readLine());
    
    
           int isFive=0;
            //2n으로 몇번 나눠지는지, 5n으로 몇번 나눠지는지 count하고,min..
            //2가 5보다 더 많음.. 걍 5로 몇번 나눠지는지, 25(5*2) 125(5*3) 몇번 들어가는지 카운트
            for (int j = 5; j <= t; j *= 5) {
                    isFive += t/j;
            }
    
    
            System.out.println(isFive +" ");
            bw.flush();
            bw.close();
    
           }
    
    
    
    }

    '자료구조와 알고리즘 > 문제풀기' 카테고리의 다른 글

    백준 17087 - 숨바꼭질 6  (0) 2023.04.10
    백준 9613 - GCD의 합  (0) 2023.04.10
    백준 6588 - 골드바흐의 추측  (0) 2023.04.10
    백준 1929번 - 소수 구하기  (0) 2023.04.10
    백준 1978 - 소수 찾기  (0) 2023.04.10
Designed by Tistory.