2010-09-21 22 views
51
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, se produce un error en la línea obj.function(600851475143);. ¿Por qué?"Número entero demasiado grande" mensaje de error para 600851475143

+1

¿también hay diferencia entre "l" y "L"? – user446654

+0

@ user446654: No, la hay. Este último es más legible. Lea "Java Puzzler" para esto. –

+0

@ user446654: evolucionando @Thilo pensamientos sobre el posible límite de memoria excedente Quiero agregar mis 2 monedas: ha elegido un algoritmo realmente, muy malo para buscar todos los divisores de un número si desea operar con números tan grandes como en su ejemplo . Algo basado en * programación dinámica * funcionaría mejor probablemente. Google sobre eso para obtener más resultados. – Roman

Respuesta

20

Es necesario utilizar un largo literal:

obj.function(600851475143l); // note the "l" at the end 

Pero yo esperaría que la función de ejecutar fuera de la memoria (o tiempo) ...

+13

se considera una mejor práctica hacer el 'l' en mayúsculas, por lo que es fácilmente distinguible de' 1' – Bozho

+2

@Bozho: De acuerdo. Pero tengo un fondo Perl. Codigo "solo escritura" :-) – Thilo

+0

-1 para usar l en minúscula. – starblue

132

600851475143 no se puede representar como una de 32 bits entero (tipo int). Se puede representar como un entero de 64 bits (tipo long). literales largos en Java terminan con una "L": 600851475143L

46

Agregue el sufijo L: 23423429L.

De forma predeterminada, java interpreta todos los literales numerales como valores enteros de 32 bits. Si desea especificar explícitamente que esto es algo más grande que el entero de 32 bits, debe usar el sufijo L para valores largos.

+0

Sin necesidad de cambiar el número, sin embargo ... – Thilo

+0

@Thilo: Puede que no sea bueno en la memorización de números y también flojo en la copia de pegar cosas. :) –

4

Necesita 40 bits para representar el número entero literal 600851475143. En Java, el valor entero máximo es 2^31-1 sin embargo (es decir, los números 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 con function. Trate de usar un literal entero largo en su lugar (como se sugiere en las otras respuestas).

10

El compilador de Java intenta interpretar 600851475143 como un valor constante de tipo int por defecto. Esto causa un error ya que 600851475143 no se puede representar con un int.

Para indicarle al compilador que desea que el número interprete como largo, debe agregar l o L después de él. Su número debería verse así 600851475143L.

Dado que algunas fuentes dificultan la distinción entre "1" y minúscula "l" entre sí, siempre debe utilizar la mayúscula "L".

3

En tiempo de compilación, el número "600851475143" está representado en un entero de 32 bits, intente con el literal largo al final de su número para salir de este problema.

0

Aparte de todas las otras respuestas, lo que puede hacer es:

long l = Long.parseLong("600851475143"); 

por ejemplo:

obj.function(Long.parseLong("600851475143")); 
0

O bien, puede declarar el número de entrada siempre, 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; 
     } 
    } 
} 
Cuestiones relacionadas