Language/Java

[Java] BigInteger

비독개 2022. 10. 24. 21:15

백준 브론즈 등급의 알고리즘 문제를 풀던 중 ....

 

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

 

2338번: 긴자리 계산

첫째 줄에 A+B, 둘째 줄에 A-B, 셋째 줄에 A×B를 출력한다. 각각을 출력할 때, 답이 0인 경우를 제외하고는 0으로 시작하게 해서는 안 된다(1을 01로 출력하면 안 된다는 의미).

www.acmicpc.net

 

위와 같은 문제를 만났다.

 

문제 설명을 봐선 크게 특별할게 없지만... 

"각각의 수는 10진수로 1,000자리를 넘지 않으며 양수와 음수가 모두 주어질 수 있다."

 

라는 설명이 있다. 

 

1,000자리면 굉장히 긴 자릿수 이기때문에 평소 사용하던 int 를 사용해선 범위를 초과하게 될것이다.

또한, long 타입으로도 해결이 되지않을것이다.

 

int : 32bits (-2147483648 ~ 2147483647)

long : 64bits (-9223372036854775808 ~ 9223372036854775807)

 

이를 대체할 방법이 있으니, 그게 바로 BigInteger를 사용하는 것이다.

 

BigInteger는 무한대의 정수를 저장할 수 있다고 한다.

 

 다시 백준의 문제를 보면 간단한 사칙연산을 해야하는데... BigInteger를 사용하면서 사칙연산을 int때와 동일하게 적용하면???

 

다음과 같은 오류를 마주치게 될것이다.

 

BigInteger는 int형과 다르게 메소드를 사용하여 연산을 해야한다.

 

- 더하기(+) : add()

- 빼기(-) : substract()

- 곱하기(*) : multiply()

- 나누기(/) : divide()

 

공식문서에서 메소드들을 확인할 수 있다.

 

출처 - https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigInteger.html

 

 

문제의 답 -

package Bronze_5.Q2338;

import java.math.BigInteger;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        BigInteger A = sc.nextBigInteger();
        BigInteger B = sc.nextBigInteger();
        sc.close();

        System.out.println(A.add(B));
        System.out.println(A.subtract(B));
        System.out.println(A.multiply(B));
    }
}