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é, une erreur est générée sur la ligne obj.function(600851475143);
. Pourquoi?
600851475143
ne peut pas être représenté sous la forme d'un entier 32 bits (type int
). Il peut être représenté sous la forme d'un entier 64 bits (type long
). les littéraux longs en Java se terminent par un "L": 600851475143L
Ajouter le suffixe L
: 23423429L
.
Par défaut, Java interprète tous les littéraux numériques comme des valeurs entières de 32 bits. Si vous souhaitez spécifier explicitement qu'il s'agit d'un nombre supérieur à un entier 32 bits, vous devez utiliser le suffixe L
pour les valeurs longues.
Vous 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) ...
Le compilateur Java tente 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ètes soit long, vous devez ajouter l
ou L
après. Votre numéro devrait alors ressembler à ceci 600851475143L
.
Certaines polices rendant difficile la distinction entre "1" et "l" minuscule, vous devez toujours utiliser la majuscule "L".
Vous avez besoin de 40 bits pour représenter le littéral entier 600851475143. En Java, la valeur entière maximale est 2 ^ 31-1. Cependant, les entiers sont 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 littéral entier long (comme suggéré dans les autres réponses).
Au moment de la compilation, le nombre "600851475143" est représenté sous forme d'entier 32 bits, essayez le long littéral à la fin de votre numéro pour résoudre ce problème.
Outre toutes les autres réponses, vous pouvez:
long l = Long.parseLong("600851475143");
par exemple :
obj.function(Long.parseLong("600851475143"));
Ou bien, vous pouvez déclarer le numéro saisi 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;
}
}
}