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();
}
}
Uruchomienie powyższego kodu powoduje błąd w wierszu obj.function(600851475143);
. Czemu?
Odpowiedzi:
600851475143
nie może być reprezentowany jako 32-bitowa liczba całkowita (typint
). Może być reprezentowany jako 64-bitowa liczba całkowita (typlong
). długie literały w Javie kończą się literą „L”:600851475143L
źródło
Dołączająca sufiks
L
:23423429L
.Domyślnie java interpretuje wszystkie literały liczbowe jako 32-bitowe wartości całkowite. Jeśli chcesz wyraźnie określić, że jest to coś większego niż 32-bitowa liczba całkowita, powinieneś używać sufiksu
L
dla długich wartości.źródło
long
, przeczytaj to: stackoverflow.com/a/8924925/293280Musisz użyć długiego literału:
obj.function(600851475143l); // note the "l" at the end
Ale spodziewałbym się, że tej funkcji zabraknie pamięci (lub czasu) ...
źródło
l
jest1
Kompilator java domyślnie próbuje zinterpretować 600851475143 jako stałą wartość typu int. Powoduje to błąd, ponieważ 600851475143 nie może być reprezentowane przez int.
Aby powiedzieć kompilatorowi, że chcesz, aby liczba była interpretowana tak długo, musisz dodać albo
l
alboL
po niej. Twój numer powinien wtedy wyglądać tak600851475143L
.Ponieważ niektóre czcionki utrudniają odróżnienie od siebie „1” i małych liter „l”, należy zawsze używać dużej litery „L”.
źródło
Potrzebujesz 40 bitów, aby przedstawić literał liczby całkowitej 600851475143. Jednak w Javie maksymalna wartość liczby całkowitej to 2 ^ 31-1 (tj. Liczby całkowite są 32-bitowe, zobacz http://download.oracle.com/javase/1.4.2/docs /api/java/lang/Integer.html ).
To nie ma z tym nic wspólnego
function
. Zamiast tego spróbuj użyć długiego literału liczby całkowitej (jak sugerowano w innych odpowiedziach).źródło
W czasie kompilacji liczba „600851475143” jest reprezentowana jako 32-bitowa liczba całkowita, zamiast tego spróbuj użyć długiego literału na końcu numeru, aby rozwiązać ten problem.
źródło
Oprócz wszystkich innych odpowiedzi, możesz zrobić:
long l = Long.parseLong("600851475143");
na przykład :
obj.function(Long.parseLong("600851475143"));
źródło
Lub możesz zadeklarować liczbę wejściową jako długą, a następnie pozwól jej wykonać kod 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; } } }
źródło