2010-09-21 7 views
51
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(); 
    } 
} 

d'erreur Lorsque le code ci-dessus est exécuté, il produit une erreur sur la ligne obj.function(600851475143);. Pourquoi?« nombre entier trop grand » message pour 600851475143

+1

aussi il n'y a pas de différence entre "l" et "L"? – user446654

+0

@ user446654: Non, il y en a. Ce dernier est plus lisible. Lisez "Java Puzzler" pour cela. –

+0

@ user446654: évolution des pensées @Thilo sur la limite de mémoire possible dépassant Je veux ajouter mes 2 pièces de monnaie: vous avez choisi vraiment, vraiment mauvais algorithme pour rechercher tous les diviseurs d'un nombre si vous voulez fonctionner avec de grands nombres comme dans votre exemple . Quelque chose basé sur * la programmation dynamique * fonctionnerait probablement mieux. Google sur cela pour d'autres résultats. – Roman

Répondre

20

Vous devez utiliser un long littéral:

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

Mais j'attendre à ce que la fonction de manquer de mémoire (ou le temps) ...

+13

il est considéré comme une meilleure pratique de faire le 'l' majuscule, de sorte qu'il est facilement distinguable de' 1' – Bozho

+2

@Bozho: D'accord. Mais j'ai un background Perl. Je code "en écriture seule" :-) – Thilo

+0

-1 pour l'utilisation de minuscules l. – starblue

132

600851475143 ne peuvent pas être représentés comme 32 bits nombre entier (type int). Il peut être représenté comme un entier de 64 bits (type long). les littéraux longs en Java se terminent par un "L": 600851475143L

46

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 voulez spécifier explicitement que c'est quelque chose de plus grand que l'entier 32 bits, vous devez utiliser le suffixe L pour les valeurs longues.

+0

Pas besoin de changer le nombre, cependant ... – Thilo

+0

@Thilo: Il pourrait ne pas être bon en mémorisant des nombres et aussi paresseux dans copier des choses. :) –

4

Vous avez besoin de 40 bits pour représenter le littéral entier 600851475143. En Java, la valeur entière maximale est cependant de 2^31-1 (c'est-à-dire que les entiers sont 32 bits, voir http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Integer.html). Ceci n'a rien à voir avec function. Essayez plutôt d'utiliser un littéral entier long (comme suggéré dans les autres réponses).

10

Le compilateur java essaie d'interpréter 600851475143 comme une valeur constante de type int par défaut. Cela provoque une erreur puisque 600851475143 ne peut pas être représenté avec un int.

Pour indiquer au compilateur que vous voulez que l'interpréteur de nombres soit long, vous devez ajouter l ou L après. Votre numéro devrait alors ressembler à ceci: 600851475143L.

Étant donné que certaines polices font qu'il est difficile de distinguer "1" et "l" les unes des autres, vous devez toujours utiliser le "L" majuscule.

3

Au moment de la compilation, le nombre "600851475143" est représenté en entier de 32 bits, essayez plutôt le long littéral à la fin de votre numéro pour résoudre ce problème.

0

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")); 
0

Ou, vous pouvez déclarer numéro d'entrée aussi longtemps, puis le laisser faire la 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; 
     } 
    } 
} 
Questions connexes