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();
}
}
Lorsque le code ci-dessus est exécuté, il produit une erreur sur la ligne obj.function(600851475143);
. Pourquoi?
Réponses:
600851475143
ne peut pas être représenté sous la forme d'un entier 32 bits (typeint
). Il peut être représenté sous la forme d'un entier 64 bits (typelong
). les longs littéraux en Java se terminent par un "L":600851475143L
la source
Append suffixe
L
:23423429L
.Par défaut, java interprète tous les littéraux numériques comme des valeurs entières 32 bits. Si vous souhaitez spécifier explicitement qu'il s'agit de quelque chose de plus grand qu'un entier 32 bits, vous devez utiliser le suffixe
L
pour les valeurs longues.la source
long
, lisez ceci: stackoverflow.com/a/8924925/293280Vous devez utiliser un long littéral:
obj.function(600851475143l); // note the "l" at the end
Mais je m'attendrais à ce que cette fonction manque de mémoire (ou de temps) ...
la source
l
majuscules, de sorte qu'il soit facilement distinguable de1
Le compilateur java essaie d'interpréter 600851475143 comme une valeur constante de type int par défaut. Cela provoque une erreur car 600851475143 ne peut pas être représenté avec un int.
Pour indiquer au compilateur que vous voulez que le nombre d'interprétations soit long, vous devez ajouter l'un
l
ou l' autre ouL
après. Votre numéro devrait alors ressembler à ceci600851475143L
.Étant donné que certaines polices rendent difficile la distinction entre "1" et "l" minuscule, vous devez toujours utiliser la majuscule "L".
la source
Vous avez besoin de 40 bits pour représenter le littéral entier 600851475143. En Java, la valeur entière maximale est cependant 2 ^ 31-1 (c'est-à-dire que les entiers sont de 32 bits, voir http://download.oracle.com/javase/1.4.2/docs /api/java/lang/Integer.html ).
Cela n'a rien à voir avec
function
. Essayez plutôt d'utiliser un long littéral entier (comme suggéré dans les autres réponses).la source
Au moment de la compilation, le nombre «600851475143» est représenté en entier 32 bits, essayez plutôt un long littéral à la fin de votre nombre pour surmonter ce problème.
la source
En dehors de toutes les autres réponses, ce que vous pouvez faire est:
long l = Long.parseLong("600851475143");
par exemple :
obj.function(Long.parseLong("600851475143"));
la source
Ou, vous pouvez déclarer le nombre d'entrée aussi longtemps, puis le laisser faire le code 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; } } }
la source