mwultong Blog ... 프로그래밍 / 계산기

컴퓨터 엑셀 워드 포토샵 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Thursday, January 18, 2007

Java/자바] 거대 무한 정수 사칙연산, BigInteger 클래스 사용 법; Big Int Plus Minus


자바의 64비트 정수형인 long 형으로도 겨우 9223372036854775807 (구백이십이경...)까지의 숫자만 나타낼 수 있습니다.

그 이상의 정수가 필요하다면 BigInteger 클래스를 사용해야 합니다. BigInteger 는 숫자의 크기에 제한이 없습니다. 사실상 무한대의 정수를 저장할 수 있습니다.

그런데 BigInteger 는 기본 자료형과 달리 사칙연산이 + - / * 이런 기호로 되지는 않고

operator + cannot be applied to java.math.BigInteger,java.math.BigInteger (플러스 연산자를 BigInteger에서 사용할 수 없음) 등의 에러가 납니다.


그래서 다음과 같은 메소드(함수)를 사용하여 연산을 해야 합니다.

더하기 : add()
빼기   : subtract()
곱하기 : multiply()
나누기 : divide()



BigInteger 가감승제(더하기 빼기 곱하기 나누기) 예제


파일명: Foo.java
(※ 스크롤 박스 사용법: 박스 안을 마우스로 클릭한 후, 키보드의 좌우 화살표키를 누르면 양옆으로 움직일 수 있습니다. 박스에서 다시 나오려면, 박스 바깥의 아무곳이나 클릭하면 됩니다.)
import java.math.BigInteger;

public class Foo {
  public static void main(String[] args) {

  // 100자리 정수 정의
  BigInteger big = new BigInteger("1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000");

  // 위의 100자리 정수 출력
  System.out.println(big);
  System.out.println(); // 줄바꿈




  // 더하기 1 (BigInteger.ONE 은 1 이라는 상수)
  big = big.add(BigInteger.ONE);
  System.out.println(big);
  System.out.println(); // 줄바꿈

  // 더하기 2
  big = big.add(BigInteger.valueOf(2));
  System.out.println(big);
  System.out.println(); // 줄바꿈

  // 빼기 3
  big = big.subtract(BigInteger.valueOf(3));
  System.out.println(big);
  System.out.println(); // 줄바꿈

  // 곱하기 2
  big = big.multiply(BigInteger.valueOf(2));
  System.out.println(big);
  System.out.println(); // 줄바꿈

  // 나누기 2 (실수가 아닌 항상 BigInteger 정수를 반환)
  big = big.divide(BigInteger.valueOf(2));
  System.out.println(big);
  System.out.println(); // 줄바꿈


  // 곱하기 0 (BigInteger.ZERO 는 0 이라는 상수)
  big = big.multiply(BigInteger.ZERO);
  System.out.println(big);
  System.out.println(); // 줄바꿈

  }
}


예를 들어 더하기 2를 할 때
big = big.add(2);
이렇게 2를 int 로 넣어주면 안되고

big = big.add(BigInteger.valueOf(2));
이렇게 2를 BigInteger 로 변환하여야 합니다.


컴파일 및 실행 결과 화면:
D:\Z>javac Foo.java && java Foo
10000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000

10000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000001

10000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000003

10000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000

20000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000

10000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000

0


D:\Z>

너무 큰 숫자라서 화면에 나타내는 것도 쉽지가 않습니다.



BigInteger 로 팩토리얼 구하기


BigInteger 를 사용하여, 팩토리얼을 구하는 좀더 실용적인 예제입니다. ▶▶ Java/자바] 팩토리얼 구하기(Factorial 값 계산) 소스; 1~100 (0~100), n 계승 [수학



거대 정수 크기 비교하기: ▶▶ Java/자바] BigInteger 형 정수 숫자, if문으로 크기 비교; Compare Big Int





참고로, 이것은 "매스매티카"에서 팩토리얼을 계산하는 장면입니다. 만약 자바로 팩토리얼 계산이 잘 안 될 경우에 시도해 볼 수 있습니다.





tag: java
자바 | Java

2 Comments:
At December 29, 2017 at 11:21 AM, Blogger 나엘지 said...

제가 biginteger를 사용하여 factorial을 계산해본 결과...
1676까지만 되네요.. 그 이상의 숫자는 biginteger로도 안되나봅니다..

 
At December 29, 2017 at 12:56 PM, Blogger mwultong said...

다음 페이지에 있는 자바 소스 코드를

Java/자바] 팩토리얼 구하기(Factorial 값 계산) 소스; 1~100 (0~100), n 계승 [수학

"Java SE 7 u80 (Apr 14, 2015)" 버전으로 컴파일하고 실행했더니

1676 이상의 큰 숫자도 팩토리얼이 잘 계산되더군요.

-----
만약, 큰 숫자의 팩토리얼을 꼭 구해야 하는데, 자바에서 잘 안되신다면, 이 포스트의 끝에 첨부한 그림처럼, "매스매티카(Mathematica)"에서 계산하시면 확실하게 계산됩니다.

 

<< Home RSS 2.0 feed

구글 Google 에서 제공하는 무료 블로그 서비스인 블로거 Blogger 의 인터넷 주소는 www.blogger.com 입니다. Blogger 에 블로그를 만들면, blogspot.com 이라는 주소에 블로그가 생성됩니다.
블로그를 직접 방문하지 않고도 최신 게시물을 구독하려면 RSS 2.0 feed 주소를 리더기에 등록하시면 됩니다.
Previous Posts
Monthly Archives
Top