Ответ 1
600851475143
не может быть представлен как 32-разрядное целое число (тип int
). Он может быть представлен как 64-битное целое число (тип long
). длинные литералы в Java заканчиваются буквой "L": 600851475143L
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);
. Почему?
600851475143
не может быть представлен как 32-разрядное целое число (тип int
). Он может быть представлен как 64-битное целое число (тип long
). длинные литералы в Java заканчиваются буквой "L": 600851475143L
Добавить суффикс L
: 23423429L
.
По умолчанию java интерпретирует все числовые литералы как 32-битные целочисленные значения. Если вы хотите явно указать, что это нечто большее, чем 32-битное целое число, вы должны использовать суффикс L
для длинных значений.
Вам нужно использовать длинный литерал:
obj.function(600851475143l); // note the "l" at the end
Но я бы ожидал, что у этой функции закончится память (или время)...
Компилятор java пытается интерпретировать 600851475143 как постоянное значение типа int по умолчанию. Это вызывает ошибку, так как 600851475143 не может быть представлен с помощью int.
Чтобы сообщить компилятору, что вы хотите, чтобы интерпретатор номера был длинным, вам нужно добавить либо l
, либо l
после него. Тогда ваш номер должен выглядеть следующим образом: 600851475143L
.
Поскольку некоторые шрифты затрудняют различать "1" и "нижний регистр" "друг от друга", вы всегда должны использовать верхний регистр "L".
Вам нужно 40 бит для представления целочисленного литерала 600851475143. В Java максимальное целочисленное значение равно 2 ^ 31-1 (т.е. целые числа - 32 бит, см. http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Integer.html).
Это не имеет ничего общего с function
. Вместо этого попробуйте использовать длинный целочисленный литерал (как предложено в других ответах).
Во время компиляции число "600851475143" представлено в 32-битовом целое, попробуйте длинный литерал вместо этого в конце вашего номера, чтобы перейти от этой проблемы.
Помимо всех других ответов, вы можете сделать следующее:
long l = Long.parseLong("600851475143");
например:
obj.function(Long.parseLong("600851475143"));
Или вы можете объявить номер ввода как можно дольше, а затем дать ему код танго: 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;
}
}
}