วิธีใช้ 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
ไม่ฉันเปลี่ยนรหัส จำนวนมากกว่า 5,000
สำเนา

คำถามที่เชื่อมโยงเป็นที่ซ้ำกันไม่ได้ดูเหมือนจะมีปัญหาเช่นเดียวกับคำถามนี้ (คำถามที่เชื่อมโยงเป็นเรื่องเกี่ยวกับที่ฟังก์ชั่นการใช้งานเพื่อให้ BigInteger สามารถเพิ่มคนนี้เป็นเรื่องเกี่ยวกับวิธีการที่จะใช้ฟังก์ชั่นเพิ่ม)
justhalf

คำตอบ:


203

BigIntegerไม่เปลี่ยนรูป javadocs ระบุว่าเพิ่ม () "[r] ส่งผลให้ BigInteger ซึ่งค่าคือ (สิ่งนี้ + val)" ดังนั้นคุณไม่สามารถเปลี่ยนแปลงได้sumคุณต้องกำหนดผลลัพธ์ของaddวิธีให้กับsumตัวแปรอีกครั้ง

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

1
int จะเพียงพอตราบใดที่คุณไม่เกิน 2 ^ 31-1 จะนานพอหากคุณไม่ได้เกิน 2 ^ 63-1
Jean Hominal

2
ซึ่งในตัวอย่างของเขาเขาจะไม่
MarkPowell

105
แต่จริง ๆ แล้วมันยากที่จะคิดว่าบางทีเขาอาจทำให้ตัวอย่างของเขาง่ายขึ้นถึงสิ่งที่เป็นปัญหา
thecoshman

@thecoshman - คุณค่อนข้างถูกต้องและจำนวน upvotes ในความคิดเห็นของคุณแสดงนี้เป็นคำแนะนำที่ชาญฉลาดสำหรับผู้อ่านทุกคำถามดังกล่าว บางคำแนะนำที่ชาญฉลาดมากขึ้นคือ " อ่านสิ่งที่คนอื่นเขียนก่อนที่จะตอบหรือแสดงความคิดเห็น. " ตัวอย่างเช่นในกรณีนี้มันไม่ได้ต้องการใด ๆความคิดตั้งแต่ OP ที่ระบุไว้อย่างชัดเจนว่าเขาไม่เพียงแค่นั้นในความเห็นดังต่อไปนี้คำถาม: " Nope ฉัน เปลี่ยนรหัสตัวเลขมีค่ามากกว่า 5,000 "
OMY

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

BigIntegerชั้นจะไม่เปลี่ยนรูปด้วยเหตุนี้คุณไม่สามารถเปลี่ยนสถานะของมัน ดังนั้นการเรียก "เพิ่ม" จะสร้างขึ้นใหม่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));

ดังนั้นเมธอด add () ของคลาส BigInteger จะไม่เพิ่มค่า BigIntger ใหม่เป็นค่าของมันเอง แต่สร้างและส่งคืนการอ้างอิง BigInteger ใหม่โดยไม่เปลี่ยน BigInteger ปัจจุบันและนี่คือสิ่งที่ทำได้แม้ในกรณีของ Strings


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เป็น 32 บิตในขณะที่long64 บิตที่สามารถมีผลรวมของค่า int ทั้งหมด


“ แต่จริง ๆ แล้วมันยากที่จะคิดว่าบางทีเขาอาจทำให้ตัวอย่างของเขาง่ายขึ้นถึงสิ่งที่เป็นปัญหา?” (quoting thecoshman)
Bulwersator

5
สำหรับคำถามนี้คำตอบของฉันคือขอบเขตของเรา ตั้งแต่หัวข้อมุ่งเน้นไปที่วิธีการใช้ BigInteger เพียงหนึ่งในประสบการณ์ส่วนตัวของฉันถ้าเราต้องการที่จะสรุปจำนวนเต็มบางส่วนและตัวเลขไม่ใหญ่มากฉันต้องการความยาว เพราะมันใช้งานง่ายและทำงานได้เร็วขึ้น สำหรับอินพุตขนาดใหญ่ BigInteger เป็นตัวเลือกที่ดี
frank.liu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.