Почему «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 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • &temp и *temp в C++
    Anonymous » » в форуме C++
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Почему `long long typedef ll` работает так же, как `typedef long long ll`? [дубликат]
    Гость » » в форуме C++
    0 Ответы
    127 Просмотры
    Последнее сообщение Гость
  • HTML5 Drag and Drop effectAllowed and dropEffect
    Гость » » в форуме Jquery
    0 Ответы
    197 Просмотры
    Последнее сообщение Гость
  • HTML5 Drag and Drop effectAllowed and dropEffect
    Anonymous » » в форуме Jquery
    0 Ответы
    86 Просмотры
    Последнее сообщение Anonymous
  • HTML5 Drag and Drop effectAllowed and dropEffect
    Anonymous » » в форуме Jquery
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous

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