2009-11-23 21 views
136

tengo este pedazo de código, que no está funcionando:Java: ¿Cómo usar BigInteger?

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?

+0

Por cierto, la suma debe caber fácilmente en 'int', por lo que no es necesario' BigInteger' para este ejemplo. – notnoop

+5

No, cambié el código. El número es más grande que 5000. –

+0

La pregunta vinculada como duplicada no parece tener el mismo problema que esta pregunta (la pregunta relacionada es acerca de * qué * función usar para que se pueda agregar BigInteger, esta es sobre * cómo * usar la función agregar) – justhalf

Respuesta

176

BigInteger es inmutable. Los javadocs afirman que add() "[r] crea un BigInteger cuyo valor es (este + valor)". Por lo tanto, no puede cambiar sum, necesita reasignar el resultado del método add a la variable sum.

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

int será suficiente siempre que no supere 2^31-1, siempre será suficiente, siempre y cuando no supere 2^63-1. –

+2

que, en su ejemplo, no lo hará. – MarkPowell

+97

¿Pero es realmente tan difícil pensar que tal vez simplificó su ejemplo hasta exactamente cuál es el problema? – thecoshman

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

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

10

BigInteger es una clase inmutable. Entonces, cada vez que haga una aritmética, debe reasignar la salida a una variable.

20

Otras respuestas lo han clavado; BigInteger es inmutable. Aquí está el pequeño cambio para que el 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

java.math.BigInteger es una clase inmutable lo que no podemos asignar nuevo objeto en la ubicación del objeto ya asignada. Sin embargo, puede crear nuevo objeto para asignar un nuevo valor como:

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

Puesto que usted está resumiendo algunos valores int juntos, no hay necesidad de usar BigInteger. long es suficiente para eso. int es de 32 bits, mientras que long es de 64 bits, que puede contener la suma de todos los valores int.

+0

"¿Pero realmente es tan difícil pensar que tal vez simplificó su ejemplo hasta exactamente cuál es el problema?" (citando a thecoshman) – Bulwersator

+2

Para esta pregunta, mi respuesta es un poco de nuestro alcance. Dado que el tema se centra en cómo usar BigInteger. Solo una de mi experiencia personal, 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 entradas a gran escala, BigInteger es la mejor opción. –

3

sí, es inmutable

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

por lo que el método add() de la clase BigInteger no añade nuevo valor BigIntger a su propio valor, pero crea y devuelve una nueva referencia BigInteger sin cambiar la corriente BigInteger y esto es lo que hacer, incluso en el caso de las cadenas

0

en realidad se puede utilizar,

BigInteger sum= new BigInteger("12345"); 

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

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

Biginteger es una clase inmutable. Es necesario asignar explícitamente el valor de la salida de resumir así:

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

Esta es ahora la octava respuesta con la misma explicación, entonces, ¿cómo es útil esta respuesta? – Tom