suheang

[백준] | JAVA, 자바 | 7489번 - 팩토리얼 본문

알고리즘

[백준] | JAVA, 자바 | 7489번 - 팩토리얼

suheang 2024. 6. 7. 21:13

https://www.acmicpc.net/problem/7489


문제 요약 :

n!은 정수 n에 대한 팩토리얼 수를 나타내는데, 이는 1부터 n까지의 모든 정수의 곱을 의미한다. 팩토리얼은 굉장히 빨리 커지기 때문에 13!는 대부분의 컴퓨터에서 32비트 정수형을, 70!은 대부분의 부동 소수점 변수의 범위를 넘어선다. 우리는 n!에 대하여 0이 아닌 최우측 수(the rightmost non-zero digit)를 찾으려고 한다. 

 

( n!의 최우측 0이 아닌 수(the rightmost non-zero digit)를 출력 )


문제 풀이 :

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int t = Integer.parseInt(br.readLine());

        for (int i = 0; i < t; i++) {
            int n = Integer.parseInt(br.readLine());
            int result = 1;
            
            for (int j = 2; j <= n; j++) {
                result *= j;

                while (result % 10 == 0) {
                    result /= 10;
                }

                result %= 100000;
            }

            System.out.println(result % 10);
        }
    }
}

 

1. 테스트 케이스의 수 t 입력받기

2. 입력받은 t 만큼 for 문 동작

3. n을 입력받기

4. 팩토리얼을 계산할 변수 result 생성

5. for 문으로 팩토리얼 계산

5 - 1. 이때 result가 10으로 나눴을 때 나머지가 0이라면 result /= 10

5 - 2. 팩토리얼을 계산하면서 수가 너무 커지는 것을 방지하기 위해 마지막 5자리까지만 유지

6. 마지막 0이 아닌 자리 출력