2015-04-03 8 views
0

Я пытаюсь решить эти проблемы, что говорит следующее:Как обрабатывать большие числа?

вы должны вычислить разницу между квадратом суммы первых п целых чисел, а сумма квадратов первого русского целого.

При вводе большого количества (например, 4094574264) ответ отрицательный. Зачем? Это должно быть положительное число.

Scanner scan = new Scanner(System.in); 
long input = scan.nextLong(); 
long answer = (input * (input + 1)/2)*(input * (input + 1)/2) - (input * (input + 1)) * ((input * 2) + 1)/6; 
System.out.println(answer); 

ответ

0

Вы, мой друг, испытываете overflow. Это когда не хватает бит для описания числа, которое вы хотите объяснить, поэтому вы в конечном итоге обходите в большом цикле (отсюда и отрицательные числа).

Решение, если вы хотите использовать невероятно большие номера, состоит в использовании классови BigDecimal. Они предназначены для создания произвольных чисел точности.

2

Проблема заключается в этой строке

(input * (input + 1)/2)*(input * (input + 1)/2) - (input * (input + 1)) * ((input * 2) + 1)/6 

4094574264 является 33-разрядное целое число, поэтому input * (input + 1) нужно будет 66 бит для хранения, который перетекает 64-бит long. Это не означает последующее умножение позже, в результате получается результат намного больше, чем 64 бит.

Если вы хотите сделать такой высокую точность арифметика, используйте BigInteger вместо

+0

Для вычисления приведенного выше выражения требуется, по крайней мере, 131-битный тип –

0

Низкоуровневого Ответ:

Ответ отрицательный, потому что вы испытываете переполнение. JVM может представлять только числа до определенного значения (максимум для этого типа.) Если вы выполняете любую операцию, которая увеличивает значение выше максимума, оно «перетекает» через возможности представления машины и полностью изменяет число; в вашем случае, к отрицательному значению. Противоположность относится к негативам: если я уменьшу отрицательное значение ниже минимума, оно будет «течь под», и я получу ответ, который является очень большим положительным. Используйте BigInteger (https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html) для «большой математики».

Смежные вопросы