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
источник
Append суффикс
L
:23423429L
.По умолчанию java интерпретирует все числовые литералы как 32-битные целые числа. Если вы хотите явно указать, что это что-то большее, чем 32-битное целое число, вы должны использовать суффикс
L
для длинных значений.источник
long
, прочтите это: stackoverflow.com/a/8924925/293280Вам нужно использовать длинный литерал:
obj.function(600851475143l); // note the "l" at the end
Но я ожидал, что этой функции не хватит памяти (или времени) ...
источник
l
верхний регистр, чтобы его было легко отличить от1
Компилятор java пытается интерпретировать 600851475143 как постоянное значение типа int по умолчанию. Это вызывает ошибку, поскольку 600851475143 не может быть представлен с int.
Чтобы сообщить компилятору, что вы хотите, чтобы число интерпретировалось как длинное, вам нужно добавить либо одно,
l
либоL
после него. Тогда ваш номер должен выглядеть так600851475143L
.Поскольку некоторые шрифты затрудняют различение «1» и строчной буквы «l» друг от друга, вы всегда должны использовать верхний регистр «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; } } }
источник