¿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?


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));

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.


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));
    }
}

11

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


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));

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


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));

0

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

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

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.


"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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.