Подтвердить что ты не робот

Сообщение об ошибке "Целое число слишком большое" для 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();
    }
}

При выполнении приведенного выше кода он выдает ошибку в строке obj.function(600851475143);. Почему?

4b9b3361

Ответ 1

600851475143 не может быть представлен как 32-разрядное целое число (тип int). Он может быть представлен как 64-битное целое число (тип long). длинные литералы в Java заканчиваются буквой "L": 600851475143L

Ответ 2

Добавить суффикс L: 23423429L.

По умолчанию java интерпретирует все числовые литералы как 32-битные целочисленные значения. Если вы хотите явно указать, что это нечто большее, чем 32-битное целое число, вы должны использовать суффикс L для длинных значений.

Ответ 3

Вам нужно использовать длинный литерал:

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

Но я бы ожидал, что у этой функции закончится память (или время)...

Ответ 4

Компилятор java пытается интерпретировать 600851475143 как постоянное значение типа int по умолчанию. Это вызывает ошибку, так как 600851475143 не может быть представлен с помощью int.

Чтобы сообщить компилятору, что вы хотите, чтобы интерпретатор номера был длинным, вам нужно добавить либо l, либо l после него. Тогда ваш номер должен выглядеть следующим образом: 600851475143L.

Поскольку некоторые шрифты затрудняют различать "1" и "нижний регистр" "друг от друга", вы всегда должны использовать верхний регистр "L".

Ответ 5

Вам нужно 40 бит для представления целочисленного литерала 600851475143. В Java максимальное целочисленное значение равно 2 ^ 31-1 (т.е. целые числа - 32 бит, см. http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Integer.html).

Это не имеет ничего общего с function. Вместо этого попробуйте использовать длинный целочисленный литерал (как предложено в других ответах).

Ответ 6

Во время компиляции число "600851475143" представлено в 32-битовом целое, попробуйте длинный литерал вместо этого в конце вашего номера, чтобы перейти от этой проблемы.

Ответ 7

Помимо всех других ответов, вы можете сделать следующее:

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

например:

obj.function(Long.parseLong("600851475143"));

Ответ 8

Или вы можете объявить номер ввода как можно дольше, а затем дать ему код танго: 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;
        }
    }
}