알고리즘/BAEKJOON

[백준] 10757번 큰 수 A+B -자바(JAVA)

hectick 2022. 1. 12. 17:49

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

 

10757번: 큰 수 A+B

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

큰 수니까 int가 아니라 long을 쓰면 되겠지?하고 접근했다가 실행시켜보니 답이 음수가 나와 털린 문제이다.

쎄해서 책을 뒤적거려보니, 예제 입력1에서 주어진 두 숫자가 예사롭지 않은 수였다.

9223372036854775807 = 263-1

9223372036854775808 = 263

그리고 long의 저장 가능한 값의 범위는 -263 ~ 263-1 이다.

배열로 직접 노가다 해야하나? 고민하다가 머리에 unsigned long이 스쳐 지나갔는데, 구글링해보니 자바는unsigned를 지원하지 않는다 하더라.

대신 BigInteger를 이용해 long의 범위를 초과하는 값을 저장할 수 있다고 한다.

BigInteger는 문자열로 이루어져 있기 때문에 숫자 범위의 제한이 없다고 한다.

 

BigInteger로 사칙연산하기

먼저 BigInteger를 사용하기 위해 다음 코드를 추가해준다.

import java.math.BigInteger;

그리고 add(), subtract(), multiply(), divide()를 사용하여 사칙연산을 하면된다.

다음은 사용 예시이다.

import java.math.BigInteger;

public class Main {
	public static void main(String[] args){
		BigInteger A = new BigInteger("12");
		BigInteger B = new BigInteger("5");

		System.out.println("A + B = " + A.add(B)); // A+B 결과 12
		System.out.println("A - B = " + A.subtract(B)); // A-B 결과 7 
		System.out.println("A * B = " + A.multiply(B)); // A*B 결과 60
		System.out.println("A / B = " + A.divide(B)); // A/B 결과 2
	}
}

이를 이용하여 제출한 코드이다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = br.readLine();
		StringTokenizer st = new StringTokenizer(str);
		String A = st.nextToken();
		String B = st.nextToken();
		BigInteger output = new BigInteger(A).add(new BigInteger(B)); //BigIntegar 사용
		System.out.println(output);
	}
}

 

 

추후 노가다를 통한 구현에 성공하면 이 게시물에 추가해 놓도록 하겠다.....