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에서 사용할 수 없음) 등의 에러가 납니다.
그래서 다음과 같은 메소드(함수)를 사용하여 연산을 해야 합니다.
파일명: Foo.java
(※ 스크롤 박스 사용법: 박스 안을 마우스로 클릭한 후, 키보드의 좌우 화살표키를 누르면 양옆으로 움직일 수 있습니다. 박스에서 다시 나오려면, 박스 바깥의 아무곳이나 클릭하면 됩니다.)
예를 들어 더하기 2를 할 때
big = big.add(2);
이렇게 2를 int 로 넣어주면 안되고
big = big.add(BigInteger.valueOf(2));
이렇게 2를 BigInteger 로 변환하여야 합니다.
컴파일 및 실행 결과 화면:
너무 큰 숫자라서 화면에 나타내는 것도 쉽지가 않습니다.
BigInteger 를 사용하여, 팩토리얼을 구하는 좀더 실용적인 예제입니다. ▶▶ Java/자바] 팩토리얼 구하기(Factorial 값 계산) 소스; 1~100 (0~100), n 계승 [수학
거대 정수 크기 비교하기: ▶▶ Java/자바] BigInteger 형 정수 숫자, if문으로 크기 비교; Compare Big Int
참고로, 이것은 "매스매티카"에서 팩토리얼을 계산하는 장면입니다. 만약 자바로 팩토리얼 계산이 잘 안 될 경우에 시도해 볼 수 있습니다.
그 이상의 정수가 필요하다면 BigInteger 클래스를 사용해야 합니다. BigInteger 는 숫자의 크기에 제한이 없습니다. 사실상 무한대의 정수를 저장할 수 있습니다.
그런데 BigInteger 는 기본 자료형과 달리 사칙연산이 + - / * 이런 기호로 되지는 않고
operator + cannot be applied to java.math.BigInteger,java.math.BigInteger (플러스 연산자를 BigInteger에서 사용할 수 없음) 등의 에러가 납니다.
그래서 다음과 같은 메소드(함수)를 사용하여 연산을 해야 합니다.
더하기 : add()
빼기 : subtract()
곱하기 : multiply()
나누기 : divide()
빼기 : 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(); // 줄바꿈
}
}
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>
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
제가 biginteger를 사용하여 factorial을 계산해본 결과...
1676까지만 되네요.. 그 이상의 숫자는 biginteger로도 안되나봅니다..
다음 페이지에 있는 자바 소스 코드를
Java/자바] 팩토리얼 구하기(Factorial 값 계산) 소스; 1~100 (0~100), n 계승 [수학
"Java SE 7 u80 (Apr 14, 2015)" 버전으로 컴파일하고 실행했더니
1676 이상의 큰 숫자도 팩토리얼이 잘 계산되더군요.
-----
만약, 큰 숫자의 팩토리얼을 꼭 구해야 하는데, 자바에서 잘 안되신다면, 이 포스트의 끝에 첨부한 그림처럼, "매스매티카(Mathematica)"에서 계산하시면 확실하게 계산됩니다.
<< Home