message d'erreur « nombre entier trop grand » pour 600851475143

voix
54
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?

Créé 21/09/2010 à 05:18
source utilisateur
Dans d'autres langues...                            


8 réponses

voix
22

Vous devez utiliser un long littéral:

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

Mais je me attends à cette fonction à court de mémoire (ou le temps) ...

Créé 21/09/2010 à 05:20
source utilisateur

voix
138

600851475143ne peut pas être représentée par un entier de 32 bits (type int). Il peut être représenté comme un nombre entier de 64 bits (type long). longues littéraux en fin Java avec un « L »:600851475143L

Créé 21/09/2010 à 05:20
source utilisateur

voix
47

Append suffixe L: 23423429L.

Par défaut, java interpréter tous les littéraux numériques comme des valeurs entières 32 bits. Si vous voulez spécifier que c'est explicitement quelque chose de grand alors entier de 32 bits , vous devez utiliser le suffixe Lpour les valeurs longues.

Créé 21/09/2010 à 05:20
source utilisateur

voix
4

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 (ie 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 d' utiliser un entier long littéral plutôt (comme suggéré dans les autres réponses).

Créé 21/09/2010 à 05:22
source utilisateur

voix
11

Le compilateur Java essaie d'interpréter 600.851.475.143 comme une valeur constante de type int par défaut. Cela provoque une erreur car 600.851.475.143 ne peut pas être représenté par un entier.

Pour dire au compilateur que vous voulez que le numéro interpretet en tant que temps vous devez soit ajouter lou Laprès. Votre numéro devrait alors ressembler à ceci 600851475143L.

Depuis quelques polices font qu'il est difficile de distinguer « 1 » et minuscules « l » un de l'autre, vous devriez toujours utiliser le boîtier supérieur « L ».

Créé 21/09/2010 à 05:29
source utilisateur

voix
3

Au moment de la compilation du nombre « 600851475143 » est représenté en entier de 32 bits, essayez de long littéral plutôt à la fin de votre numéro pour obtenir plus de ce problème.

Créé 21/09/2010 à 10:59
source utilisateur

voix
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"));
Créé 22/01/2017 à 11:33
source utilisateur

voix
0

Ou, vous pouvez déclarer numéro d'entrée tant, puis laissez-le faire le tango code: 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;
        }
    }
}
Créé 25/06/2017 à 07:21
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more