Làm thế nào để sử dụng BigInteger?


153

Tôi có đoạn mã này không hoạt động:

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

Biến tổng luôn là 0. Tôi đang làm gì sai?


Nhân tiện, tổng sẽ dễ dàng phù hợp int, vì vậy bạn không cần BigIntegerví dụ này.
không có

8
Không, tôi đã thay đổi mã. Số lượng lớn hơn 5000.
cc.

Câu hỏi liên quan như trùng lặp dường như không có vấn đề tương tự như câu hỏi này (các câu hỏi liên quan là về chức năng để sử dụng nên BigInteger có thể được thêm vào, cái này là về cách sử dụng chức năng add)
justhalf

Câu trả lời:


203

BigIntegerlà bất biến. Các javadocs tuyên bố rằng thêm () "[r] thay thế một BigInteger có giá trị là (this + val)." Do đó, bạn không thể thay đổi sum, bạn cần gán lại kết quả của addphương thức để sumbiến.

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

1
int sẽ là đủ miễn là bạn không vượt quá 2 ^ 31-1, miễn là đủ miễn là bạn không vượt quá 2 ^ 63-1.
Jean Hominal

2
Mà trong ví dụ của mình, anh sẽ không.
MarkPowell

105
Nhưng có thật là khó nghĩ có lẽ anh ta đã đơn giản hóa ví dụ của mình xuống chính xác vấn đề là gì?
thecoshman

@thecoshman - Bạn khá chính xác và số lượng upvote trên bình luận của bạn cho thấy đây là lời khuyên khôn ngoan cho tất cả người đọc những câu hỏi như vậy. Một số lời khuyên khôn ngoan hơn là " đọc những gì người khác đã viết trước khi trả lời hoặc bình luận. " Ví dụ trong trường hợp này nó thậm chí không đòi hỏi bất kỳ suy nghĩ kể từ khi OP nêu rõ rằng ông đã làm điều đó trong các ý kiến dưới đây câu hỏi: " Không, tôi đã thay đổi mã. Số lượng lớn hơn 5000. "
OMY

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

Các BigIntegerlớp học là không thay đổi, do đó bạn không thể thay đổi trạng thái của nó. Vì vậy, gọi "thêm" tạo ra một cái mới BigInteger, thay vì sửa đổi hiện tại.


22

Các câu trả lời khác đã đóng đinh nó; BigInteger là bất biến. Đây là thay đổi nhỏ để làm cho mã đó hoạt động.

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

11

BigInteger là một lớp bất biến. Vì vậy, bất cứ khi nào bạn thực hiện bất kỳ số học nào, bạn phải gán lại đầu ra cho một biến.


11

java.math.BigIntegerlà một lớp bất biến nên chúng ta không thể gán đối tượng mới ở vị trí của đối tượng đã được gán. Nhưng bạn có thể tạo đối tượng mới để gán giá trị mới như:

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

3

Vâng, nó là bất biến

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

vì vậy, phương thức add () của lớp BigInteger không thêm giá trị BigIntger mới vào giá trị riêng của nó, nhưng tạo và trả về một tham chiếu BigInteger mới mà không thay đổi BigInteger hiện tại và đây là điều được thực hiện ngay cả trong trường hợp của String


0

Trên thực tế bạn có thể sử dụng,

BigInteger sum= new BigInteger("12345");

để tạo đối tượng cho lớp BigInteger. Nhưng vấn đề ở đây là, bạn không thể đưa ra một biến trong dấu ngoặc kép. Vì vậy, chúng ta phải sử dụng phương thức valueOf () và chúng ta phải lưu lại câu trả lời trong tổng đó. Chúng ta sẽ viết,

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

0

Bigintegerlà một lớp bất biến. Bạn cần gán rõ ràng giá trị đầu ra của mình để tính tổng như thế này:

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

4
Đây là câu trả lời thứ 8 với cùng một lời giải thích, vậy câu trả lời này hữu ích như thế nào?
Tom

-6

Vì bạn đang tổng hợp một số giá trị int với nhau, không cần sử dụng BigInteger. longlà đủ cho điều đó intlà 32 bit, trong khi longlà 64 bit, có thể chứa tổng của tất cả các giá trị int.


"Nhưng có thực sự khó nghĩ đến vậy có lẽ anh ta đã đơn giản hóa ví dụ của mình xuống chính xác vấn đề là gì?" (trích lời thecoshman)
Bulwersator

5
Đối với câu hỏi này, câu trả lời của tôi là một chút phạm vi của chúng tôi. Vì chủ đề tập trung vào cách sử dụng BigInteger. Chỉ là một trong những trải nghiệm cá nhân của tôi, nếu chúng tôi muốn tổng hợp một số số nguyên và các số không lớn, tôi sẽ thích lâu hơn. Bởi vì nó dễ sử dụng và chạy nhanh hơn. Đối với đầu vào quy mô lớn, BigInteger là lựa chọn tốt.
thẳng thắn.liu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.