BigInteger를 사용하는 방법?


153

이 코드 조각이 있는데 작동하지 않습니다.

BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
    if (isPrim(i)) {
        sum.add(BigInteger.valueOf(i));
    }
}

합계 변수는 항상 0입니다. 내가 뭘 잘못하고 있습니까?


그건 그렇고, 합계는에 쉽게 맞아야 하므로이 예제는 int필요하지 않습니다 BigInteger.
notnoop

8
아니요, 코드를 변경했습니다. 숫자가 5000보다 큽니다.
cc.

중복으로 연결된 질문은이 질문과 같은 문제가없는 것 같습니다 (링크 된 질문은 BigInteger를 추가 할 수 있도록 사용할 함수에 관한 것 입니다 , 이것은 add 함수를 사용하는 방법 에 관한 것입니다 )
justhalf

답변:


203

BigInteger불변입니다. javadocs는 add () "[r] 값이 (this + val) 인 BigInteger를 반환합니다"라고 말합니다. 따라서 변경할 수 없으므로 메소드 sum결과 addsum변수 에 다시 할당해야 합니다.

sum = sum.add(BigInteger.valueOf(i));

1
int는 2 ^ 31-1을 넘지 않는 한 충분할 것이고, 2 ^ 63-1을 넘지 않는 한 충분할 것입니다.
Jean Hominal

2
그의 예에서 그는 그렇지 않습니다.
MarkPowell

105
그러나 그가 생각하기가 어려워서 아마도 그의 문제를 정확히 무엇으로 바꾸었을까요?
thecoshman

@ thecoshman-당신은 꽤 정확하며 귀하의 의견에 대한 공언 수는 이러한 질문을 읽는 모든 독자에게 현명한 조언임을 보여줍니다. 좀 더 현명한 조언은 " 다른 사람들이 대답하거나 의견을 전에 쓴 것을 읽어. "그것도 필요하지 않습니다이 경우 예를 들어 어떤 영업 이익은 분명 그가했던 것을 주장하기 때문에 생각을 그냥 질문 아래의 코멘트에 " 아니, I 코드가 변경되었습니다. 숫자가 5000보다 큽니다. "
OMY

58
sum = sum.add(BigInteger.valueOf(i))

BigInteger클래스는 따라서 당신이 그 상태를 변경할 수 없습니다, 변경할 수 없습니다. 따라서 "add"를 호출 BigInteger하면 전류를 수정하지 않고 새로운을 만듭니다 .


22

다른 응답자들이 그것을 못 박았다; BigInteger는 변경할 수 없습니다. 해당 코드가 작동하도록 약간 변경되었습니다.

BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
    if (isPrim(i)) {
        sum = sum.add(BigInteger.valueOf(i));
    }
}

11

BigInteger는 변경할 수없는 클래스입니다. 따라서 산술을 할 때마다 출력을 변수에 다시 할당해야합니다.


11

java.math.BigInteger불변 클래스이므로 이미 할당 된 객체의 위치에 새 객체를 할당 할 수 없습니다. 그러나 다음과 같이 새 값을 할당하기 위해 새 개체를 만들 수 있습니다.

sum = sum.add(BigInteger.valueOf(i));

3

예, 불변입니다

sum.add(BigInteger.valueOf(i));

따라서 BigInteger 클래스의 add () 메소드는 새로운 BigIntger 값을 자체 값에 추가하지 않지만 현재 BigInteger를 변경하지 않고 새로운 BigInteger 참조작성하고 리턴 하며 이는 문자열의 경우에도 수행됩니다.


0

실제로 사용할 수 있습니다.

BigInteger sum= new BigInteger("12345");

BigInteger 클래스의 객체를 생성하기위한 것이지만 여기서 문제는 큰 따옴표로 변수를 제공 할 수 없기 때문에 valueOf () 메서드 를 사용해야하고 그 합계에 답을 다시 저장해야합니다.

sum= sum.add(BigInteger.valueOf(i));

0

Biginteger불변의 클래스입니다. 다음과 같이 요약하려면 출력 값을 명시 적으로 할당해야합니다.

sum = sum.add(BigInteger.valueof(i));    

4
이것은 동일한 설명을 가진 8 번째 답변이므로이 답변이 어떻게 도움이됩니까?
Tom

-6

일부 int 값을 합산하므로 BigInteger를 사용할 필요가 없습니다. long그것으로 충분합니다. 모든 int 값의 합을 포함 할 수있는 int32 비트, long64 비트입니다.


"하지만 그가 생각하기가 어려워서 아마도 그의 문제를 정확히 무엇으로 바 꾸었 을까?" (Thecoshman 인용)
Bulwersator

5
이 질문에 대한 나의 대답은 우리의 범위입니다. 이 주제는 BigInteger 사용 방법에 중점을 둡니다. 내 개인적인 경험 중 하나, 정수를 요약하고 숫자가 너무 크지 않으면 오래 선호합니다. 사용하기 쉽고 더 빠르기 때문입니다. 대규모 입력의 경우 BigInteger가 적합합니다.
frank.liu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.