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();
}
}
Wenn der obige Code ausgeführt wird, wird in der Zeile ein Fehler ausgegeben obj.function(600851475143);
. Warum?
Antworten:
600851475143
kann nicht als 32-Bit-Ganzzahl (Typint
) dargestellt werden. Es kann als 64-Bit-Ganzzahl (Typlong
) dargestellt werden. lange Literale in Java enden mit einem "L":600851475143L
quelle
Suffix anhängen
L
:23423429L
.Standardmäßig interpretiert Java alle Zahlenliterale als 32-Bit-Ganzzahlwerte. Wenn Sie explizit angeben möchten, dass dies eine größere als die 32-Bit-Ganzzahl ist, sollten Sie das Suffix
L
für lange Werte verwenden.quelle
long
, lesen Sie FolgendesSie müssen ein langes Literal verwenden:
Aber ich würde erwarten, dass dieser Funktion der Speicher (oder die Zeit) ausgeht ...
quelle
l
, Großbuchstaben , so dass es aus leicht zu unterscheiden ist1
Der Java-Compiler versucht, 600851475143 standardmäßig als konstanten Wert vom Typ int zu interpretieren. Dies verursacht einen Fehler, da 600851475143 nicht mit einem int dargestellt werden kann.
Um dem Compiler mitzuteilen, dass die Nummer so lange interpretiert werden soll, müssen Sie entweder
l
oderL
danach hinzufügen . Ihre Nummer sollte dann so aussehen600851475143L
.Da es bei einigen Schriftarten schwierig ist, "1" und "l" in Kleinbuchstaben voneinander zu unterscheiden, sollten Sie immer "L" in Großbuchstaben verwenden.
quelle
Sie benötigen 40 Bit, um das Ganzzahlliteral 600851475143 darzustellen. In Java beträgt der maximale Ganzzahlwert jedoch 2 ^ 31-1 (dh Ganzzahlen sind 32 Bit, siehe http://download.oracle.com/javase/1.4.2/docs) /api/java/lang/Integer.html ).
Das hat nichts damit zu tun
function
. Versuchen Sie stattdessen, ein langes ganzzahliges Literal zu verwenden (wie in den anderen Antworten vorgeschlagen).quelle
Zur Kompilierungszeit wird die Nummer "600851475143" in einer 32-Bit-Ganzzahl dargestellt. Versuchen Sie stattdessen am Ende Ihrer Nummer ein langes Literal, um dieses Problem zu lösen.
quelle
Abgesehen von all den anderen Antworten können Sie Folgendes tun:
zum Beispiel :
quelle
Oder Sie können die Eingabenummer so lange deklarieren und dann den Code Tango ausführen lassen: D ...
quelle