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?
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?
Respuestas:
BigInteger
Es 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 add
método a sum
variable.
sum = sum.add(BigInteger.valueOf(i));
BigInteger es una clase inmutable. Por lo tanto, cada vez que realice una aritmética, debe reasignar la salida a una variable.
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
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));
Biginteger
Es una clase inmutable. Debe asignar explícitamente el valor de su salida para sumar así:
sum = sum.add(BigInteger.valueof(i));
Dado que están sumando algunos valores int juntos, no es necesario 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.
int
, por lo que no es necesarioBigInteger
para este ejemplo.