¿Cómo usar BigInteger?

153

Tengo este fragmento de código, que no funciona:

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

La variable suma es siempre 0. ¿Qué estoy haciendo mal?

cc.
fuente
Por cierto, la suma debería encajar fácilmente int, por lo que no es necesario BigIntegerpara este ejemplo.
notnoop el
8
No, cambié el código. El número es mayor que 5000.
cc.
La pregunta vinculada como duplicado no parece tener el mismo problema que esta pregunta (la pregunta vinculada es acerca de qué función usar para poder agregar BigInteger, esta es acerca de cómo usar la función agregar)
solo el

Respuestas:

203

BigIntegerEs inmutable. El javadocs establece que add () "[r] genera un BigInteger cuyo valor es (this + val)". Por lo tanto, no puede cambiar sum, debe reasignar el resultado del addmétodo a sumvariable.

sum = sum.add(BigInteger.valueOf(i));
MarkPowell
fuente
1
int será suficiente siempre que no pase de 2 ^ 31-1, largo será suficiente siempre que no pase de 2 ^ 63-1.
Jean Hominal
2
Lo cual, en su ejemplo, no lo hará.
MarkPowell el
105
Pero, ¿es realmente tan difícil de pensar, quizás él simplificó su ejemplo exactamente a cuál es el problema?
thecoshman
@thecoshman: tiene bastante razón y la cantidad de votos a favor en su comentario muestra que este es un buen consejo para todos los lectores de tales preguntas. Un consejo más sabio es " lee lo que otros escribieron antes de responder o comentar " . Por ejemplo, en este caso ni siquiera requiere NINGÚN pensamiento, ya que el OP declaró claramente que hizo exactamente eso en los comentarios debajo de la pregunta: " No, yo cambió el código. El número es mayor que 5000. "
OMY
58
sum = sum.add(BigInteger.valueOf(i))

La BigIntegerclase es inmutable, por lo tanto, no puede cambiar su estado. Por lo tanto, llamar a "agregar" crea un nuevo BigInteger, en lugar de modificar el actual.

Bozho
fuente
22

Otras respuestas lo han clavado; BigInteger es inmutable. Aquí está el cambio menor para que ese código funcione.

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

BigInteger es una clase inmutable. Por lo tanto, cada vez que realice una aritmética, debe reasignar la salida a una variable.

Poindexter
fuente
11

java.math.BigIntegeres una clase inmutable , por lo que no podemos asignar un nuevo objeto en la ubicación del objeto ya asignado. Pero puede crear un nuevo objeto para asignar un nuevo valor como:

sum = sum.add(BigInteger.valueOf(i));
Arvind
fuente
3

Si es inmutable

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

entonces el método add () de la clase BigInteger no agrega un nuevo valor BigIntger a su propio valor, sino que crea y devuelve una nueva referencia BigInteger sin cambiar el BigInteger actual y esto es lo que se hace incluso en el caso de Strings

murali krish
fuente
0

En realidad puedes usar,

BigInteger sum= new BigInteger("12345");

para crear objetos para la clase BigInteger. Pero el problema aquí es que no puede dar una variable entre comillas dobles. Por lo tanto, tenemos que usar el método valueOf () y tenemos que almacenar la respuesta en esa suma nuevamente. Entonces escribiremos,

sum= sum.add(BigInteger.valueOf(i));
Harry
fuente
0

BigintegerEs una clase inmutable. Debe asignar explícitamente el valor de su salida para sumar así:

sum = sum.add(BigInteger.valueof(i));    
Arpna Joshi
fuente
44
Esta es ahora la octava respuesta con la misma explicación, entonces, ¿cómo es útil esta respuesta?
Tom
-6

Dado que están sumando algunos valores int juntos, no es necesario usar BigInteger. longes suficiente para eso intes de 32 bits, mientras que longes de 64 bits, que puede contener la suma de todos los valores int.

frank.liu
fuente
"Pero, ¿es realmente tan difícil de pensar, quizás él simplificó su ejemplo exactamente a cuál es el problema?" (citando thecoshman)
Bulwersator
55
Para esta pregunta, mi respuesta es un poco nuestra de alcance. Dado que el tema se centra en cómo usar BigInteger. Solo una de mis experiencias personales, si queremos resumir algunos enteros y los números no son muy grandes, preferiría mucho tiempo. Porque es fácil de usar y funciona más rápido. Para entrada a gran escala, BigInteger es la buena opción.
frank.liu