web-dev-qa-db-fra.com

Message d'erreur "Nombre entier trop grand" pour 600851475143

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?

61
user446654

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

163
Yuliy

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.

53
Roman

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) ...

23
Thilo

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".

11
josefx

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).

5
Andre Holzner

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.

3
JVM

Outre toutes les autres réponses, vous pouvez: 

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

par exemple : 

obj.function(Long.parseLong("600851475143"));
1
Anand Undavia

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;
        }
    }
}
0
Milen.Jeremic