public class Three {
public static void main(String[] args) {
Three obj = new Three();
obj.function(600851475143);
}
private Long function(long i) {
Stack<Long> stack = new Stack<Long>();
for (long j = 2; j <= i; j++) {
if (i % j == 0) {
stack.push(j);
}
}
return stack.pop();
}
}
Cuando se ejecuta el código anterior, produce un error en la línea obj.function(600851475143);
. ¿Por qué?
Respuestas:
600851475143
no se puede representar como un entero de 32 bits (tipoint
). Puede representarse como un entero de 64 bits (tipolong
). los literales largos en Java terminan con una "L":600851475143L
fuente
Anexar sufijos
L
:23423429L
.De forma predeterminada, Java interpreta todos los literales numéricos como valores enteros de 32 bits. Si desea especificar explícitamente que esto es algo más grande que un entero de 32 bits, debe usar el sufijo
L
para valores largos.fuente
long
, lea esto: stackoverflow.com/a/8924925/293280Necesitas usar un literal largo:
obj.function(600851475143l); // note the "l" at the end
Pero esperaría que esa función se quede sin memoria (o tiempo) ...
fuente
l
mayúsculas, de modo que se pueda distinguir fácilmente de1
El compilador de Java intenta interpretar 600851475143 como un valor constante de tipo int por defecto. Esto provoca un error ya que 600851475143 no se puede representar con un int.
Para decirle al compilador que desea que el número se interprete como largo, debe agregar
l
oL
después. Su número debería verse así600851475143L
.Dado que algunas fuentes dificultan la distinción entre "1" y "l" minúscula, siempre debe utilizar la "L" mayúscula.
fuente
Necesita 40 bits para representar el literal entero 600851475143. Sin embargo, en Java, el valor entero máximo es 2 ^ 31-1 (es decir, los enteros son 32 bits, consulte http://download.oracle.com/javase/1.4.2/docs /api/java/lang/Integer.html ).
Esto no tiene nada que ver
function
. Intente usar un literal entero largo en su lugar (como se sugiere en las otras respuestas).fuente
En el momento de la compilación, el número "600851475143" se representa en un entero de 32 bits, pruebe con un literal largo al final de su número para superar este problema.
fuente
Aparte de todas las otras respuestas, lo que puede hacer es:
long l = Long.parseLong("600851475143");
por ejemplo :
obj.function(Long.parseLong("600851475143"));
fuente
O puede declarar el número de entrada tan largo y luego dejar que haga el código tango: D ...
public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("Enter a number"); long n = in.nextLong(); for (long i = 2; i <= n; i++) { while (n % i == 0) { System.out.print(", " + i); n /= i; } } }
fuente