Почему «long long and = n * n;» правильно, но "long long temp = (n - i - 1) * (n - i - 1);" неправильно? [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему «long long and = n * n;» правильно, но "long long temp = (n - i - 1) * (n - i - 1);" неправильно? [закрыто]

Сообщение Anonymous »

Мне нужно вычислить некоторые значения в большом массиве. Я заметил, что следующие два фрагмента кода ведут себя по-разному с точки зрения корректности при использовании long long:

Код: Выделить всё

long long ans = n * n;
и

Код: Выделить всё

long long temp = (n - i - 1) * (n - i - 1);
Почему первый работает правильно, а второй дает неверные результаты, когда я использую большие значения? И n, и i являются целыми числами (), и оба вычисления используются для вычисления больших чисел. Однако первый вариант выглядит нормально, а второй не работает при определенных условиях (особенно когда n - i - 1 велико).
Я использую значения n и i в некоторой задаче оптимизации, и когда n велико (например, до 10^12), умножение (n - i - 1) может переполнить ограничение на 32-битное целое число.
Я был бы признателен, если бы кто-нибудь разъяснил:
Почему первый случай работает, даже если n * n может переполнить int?
Почему во втором случае возникают проблемы с большими значениями n - i - 1?
Как использование 1LL решает эту проблему?
Когда я заменяю второй случай с:

Код: Выделить всё

long long temp = 1LL * (n - i - 1) * (n - i - 1);
< /code>
Это работает нормально. Но я не понимаю, почему исходное выражение с использованием просто int для умножения (без 1ll 
) приводит к проблемам.

Подробнее здесь: https://stackoverflow.com/questions/793 ... mp-n-i-1-n
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»