2012-05-11 5 views
1

Problème: Je ne peux pas stocker le numéro '600851475143'. Je me rends compte que ce nombre est plus grand que ce qu'un int peut contenir et est plus petit que la valeur longue maximale. Cependant, mon programme n'enregistre pas la variable "nombre" comme un long, il l'enregistre comme un int. Quelqu'un peut-il faire la lumière sur ce problème?Java confondant les types de données primitifs?

** - Ligne du problème

public class Problem3{ 
//What is the largest prime factor of the number 600851475143 
public static void main(String[] args){ 
    ***long number = 600851475143 , total = 0; 
    for(long x = (number-1)/2; x>1; x--) 
     if(number%x == 0 && isPrime(x)) total += x; 
    System.out.println(total); 
} 
private static boolean isPrime(long determine){ 
    for(long x = determine/2 - 1; x>1; x--) 
    if(determine%x ==0) return false; 
    return true; 
} 

}

SOLUTION: Comme Jim dit ci-dessous, afin de type long, il faut mettre un "L" ou "l" à la fin du nombre. "Un littéral entier est de type long s'il se termine par la lettre L ou l, sinon il est de type int. Il est recommandé d'utiliser la lettre majuscule L car la lettre minuscule l est difficile à distinguer du chiffre 1." - Du site Oracle sur les types Primitifs.

Un peu plus d'info: Java's L number (long) specification

+3

« L » arrière, je vois 2147483647 dans votre code, ne 600851475143. pas que cela devrait provoquer 'number' être un entier et non une longue. .. – BoltClock

+0

Désolé, j'essayais de résoudre mon problème. Le "2147483647" est le nombre maximum qui peut être stocké comme un int. J'ai réalisé que n'importe quel nombre au-dessus de ce nombre causait une erreur. J'ai édité mon message original pour éviter toute confusion potentielle pour les gens à l'avenir. – user1390463

Répondre

4

Mettez une petite 'L' dans cette valeur littérale:

600851475143L 

La raison en est:

Un littéral entier est de type long si elle se termine par la lettre L ou l; sinon c'est de type int. Il est recommandé d'utiliser la lettre majuscule L parce que la lettre minuscule l est difficile de distinguer le chiffre 1.

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Vous pouvez utiliser cette notation aussi, pour être plus clair:

600_851_475_143L 
+2

Ne doit pas être un petit 'l', ça peut aussi être un gros L. – EJP

+3

Je déconseille d'utiliser L en minuscule, car il ressemble souvent à un 1 (un). Au lieu de cela, utilisez majuscule L. – Brigham

+0

Oui, il est parfois difficile de distinguer l de 1. Merci –

4

"my program isn't registering the variable "number" as a long, it is registering it as a int".

Ce n'est pas correct. Vous l'avez déclaré long. C'est long. Ce que vous devez obtenir est quelque chose de tout à fait différent: compiler l'erreur sur la constante 600851475143. Essayez 600851475143L. Je suggère que si vous lisez le message d'erreur du compilateur plus attentivement, vous auriez vu cela.

+0

Merci, j'ai fait d'autres recherches après. Mon compilateur a seulement dit "Erreur: nombre entier trop grand: 6008514751143". – user1390463

+1

@ user1390463 Exactement comme je l'ai dit. Le compilateur vous a dit exactement ce qui ne va pas. Votre première erreur a consisté à interpréter ce que le message vous a dit «n'enregistre pas le nombre de variables» comme étant long. – EJP

12

long littéraux doivent être exprimés avec comme dans 600851475143L

+0

Merci Jim. Cela a beaucoup aidé. – user1390463

Questions connexes