ฉันมีรหัสชิ้นนี้ซึ่งใช้งานไม่ได้:
BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
if (isPrim(i)) {
sum.add(BigInteger.valueOf(i));
}
}
ผลรวมของตัวแปรอยู่เสมอ 0 ฉันทำอะไรผิด
ฉันมีรหัสชิ้นนี้ซึ่งใช้งานไม่ได้:
BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
if (isPrim(i)) {
sum.add(BigInteger.valueOf(i));
}
}
ผลรวมของตัวแปรอยู่เสมอ 0 ฉันทำอะไรผิด
คำตอบ:
BigInteger
ไม่เปลี่ยนรูป javadocs ระบุว่าเพิ่ม () "[r] ส่งผลให้ BigInteger ซึ่งค่าคือ (สิ่งนี้ + val)" ดังนั้นคุณไม่สามารถเปลี่ยนแปลงได้sum
คุณต้องกำหนดผลลัพธ์ของadd
วิธีให้กับsum
ตัวแปรอีกครั้ง
sum = sum.add(BigInteger.valueOf(i));
sum = sum.add(BigInteger.valueOf(i))
BigInteger
ชั้นจะไม่เปลี่ยนรูปด้วยเหตุนี้คุณไม่สามารถเปลี่ยนสถานะของมัน ดังนั้นการเรียก "เพิ่ม" จะสร้างขึ้นใหม่BigInteger
แทนที่จะปรับเปลี่ยนกระแส
คำตอบอื่น ๆ ได้ถูกจับมัน; BigInteger ไม่เปลี่ยนรูป นี่คือการเปลี่ยนแปลงเล็กน้อยเพื่อให้รหัสทำงาน
BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
if (isPrim(i)) {
sum = sum.add(BigInteger.valueOf(i));
}
}
BigInteger เป็นคลาสที่ไม่เปลี่ยนรูป ดังนั้นเมื่อใดก็ตามที่คุณทำเลขคณิตคุณต้องกำหนดเอาต์พุตให้กับตัวแปรอีกครั้ง
java.math.BigInteger
เป็นคลาสที่ไม่เปลี่ยนรูปดังนั้นเราจึงไม่สามารถกำหนดวัตถุใหม่ในตำแหน่งของวัตถุที่กำหนดไว้แล้ว แต่คุณสามารถสร้างวัตถุใหม่เพื่อกำหนดค่าใหม่เช่น:
sum = sum.add(BigInteger.valueOf(i));
ใช่มันไม่เปลี่ยนรูป
sum.add(BigInteger.valueOf(i));
ดังนั้นเมธอด add () ของคลาส BigInteger จะไม่เพิ่มค่า BigIntger ใหม่เป็นค่าของมันเอง แต่สร้างและส่งคืนการอ้างอิง BigInteger ใหม่โดยไม่เปลี่ยน BigInteger ปัจจุบันและนี่คือสิ่งที่ทำได้แม้ในกรณีของ Strings
จริงๆแล้วคุณสามารถใช้
BigInteger sum= new BigInteger("12345");
สำหรับการสร้างออบเจ็กต์สำหรับคลาส BigInteger แต่ปัญหาที่นี่คือคุณไม่สามารถให้ตัวแปรในเครื่องหมายคำพูดคู่ดังนั้นเราต้องใช้วิธีvalueOf ()และเราต้องเก็บคำตอบไว้ในผลรวมนั้นอีกครั้งดังนั้นเราจะเขียน
sum= sum.add(BigInteger.valueOf(i));
Biginteger
เป็นชั้นที่ไม่เปลี่ยนรูป คุณต้องกำหนดมูลค่าของผลลัพธ์ให้ชัดเจนเช่นนี้:
sum = sum.add(BigInteger.valueof(i));
เนื่องจากคุณกำลังรวมค่า int บางอย่างเข้าด้วยกันจึงไม่จำเป็นต้องใช้ BigInteger long
ก็เพียงพอแล้ว int
เป็น 32 บิตในขณะที่long
64 บิตที่สามารถมีผลรวมของค่า int ทั้งหมด
int
ดังนั้นคุณไม่จำเป็นBigInteger
สำหรับตัวอย่างนี้