Messaggio di errore “Numero intero troppo grande” per 600851475143

public class Three { public static void main(String[] args) { Three obj = new Three(); obj.function(600851475143); } private Long function(long i) { Stack stack = new Stack(); for (long j = 2; j <= i; j++) { if (i % j == 0) { stack.push(j); } } return stack.pop(); } } 

Quando viene eseguito il codice precedente, viene generato un errore sulla riga obj.function(600851475143); . Perché?

600851475143 non può essere rappresentato come numero intero a 32 bit (tipo int ). Può essere rappresentato come un numero intero a 64 bit (tipo long ). i letterali lunghi in Java terminano con una “L”: 600851475143L

Aggiungere il suffisso L : 23423429L .

Per impostazione predefinita, java interpreta tutti i valori letterali numerici come valori interi a 32 bit. Se si desidera specificare esplicitamente che questo è qualcosa di più grande di un intero a 32 bit, è necessario utilizzare il suffisso L per i valori lunghi.

Devi usare un letterale lungo:

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

Ma mi aspetterei che questa funzione esaurisca la memoria (o il tempo) …

Il compilatore java tenta di interpretare 600851475143 come valore costante di tipo int per impostazione predefinita. Ciò causa un errore poiché 600851475143 non può essere rappresentato con un int.

Per dire al compilatore che vuoi interpretare il numero come un lungo devi aggiungere l o L dopo di esso. Il tuo numero dovrebbe quindi assomigliare a questo 600851475143L .

Poiché alcuni tipi di carattere rendono difficile distinguere tra “1” e minuscolo “l” l’uno dall’altro, è necessario utilizzare sempre la lettera maiuscola “L”.

Hai bisogno di 40 bit per rappresentare il numero intero letterale 600851475143. In Java, il valore intero massimo è 2 ^ 31-1 tuttavia (cioè gli interi sono a 32 bit, vedi http://download.oracle.com/javase/1.4.2/docs /api/java/lang/Integer.html ).

Questo non ha nulla a che fare con la function . Prova invece a utilizzare un letterale intero lungo (come suggerito nelle altre risposte).

Al momento della compilazione, il numero “600851475143” è rappresentato in numero intero a 32 bit, prova invece a letterale lungo alla fine del tuo numero per superare questo problema.

Oltre a tutte le altre risposte, quello che puoi fare è:

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

per esempio :

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

Oppure, è ansible dichiarare il numero di input più a lungo, quindi lasciare che faccia il codice 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; } } }