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();
}
}
Quando o código acima é executado, ele produz um erro na linha obj.function(600851475143);
. Por quê?
Respostas:
600851475143
não pode ser representado como um número inteiro de 32 bits (tipoint
). Ele pode ser representado como um número inteiro de 64 bits (tipolong
). literais longos em Java terminam com um "L":600851475143L
fonte
Acrescentar sufixo
L
:23423429L
.Por padrão, o java interpreta todos os literais numéricos como valores inteiros de 32 bits. Se você deseja especificar explicitamente que é algo maior que um inteiro de 32 bits, você deve usar o sufixo
L
para valores longos.fonte
long
, leia isto: stackoverflow.com/a/8924925/293280Você precisa usar um literal longo:
obj.function(600851475143l); // note the "l" at the end
Mas espero que essa função fique sem memória (ou tempo) ...
fonte
l
1
O compilador java tenta interpretar 600851475143 como um valor constante do tipo int por padrão. Isso causa um erro, pois 600851475143 não pode ser representado com um int.
Para dizer ao compilador que você deseja que o número seja interpretado como longo, você deve adicionar um
l
ouL
depois dele. Seu número deve ficar assim600851475143L
.Uma vez que algumas fontes tornam difícil distinguir "1" e "l" minúsculo, você deve sempre usar o "L" maiúsculo.
fonte
Você precisa de 40 bits para representar o literal inteiro 600851475143. Em Java, o valor inteiro máximo é 2 ^ 31-1 no entanto (ou seja, os inteiros são de 32 bits, consulte http://download.oracle.com/javase/1.4.2/docs /api/java/lang/Integer.html ).
Isso não tem nada a ver com
function
. Tente usar um literal inteiro longo (como sugerido nas outras respostas).fonte
Em tempo de compilação, o número "600851475143" é representado em um inteiro de 32 bits, tente literal longo no final do seu número para superar este problema.
fonte
Além de todas as outras respostas, o que você pode fazer é:
long l = Long.parseLong("600851475143");
por exemplo :
obj.function(Long.parseLong("600851475143"));
fonte
Ou você pode declarar o número de entrada contanto que ele faça o 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; } } }
fonte