Почему не считается без numeric _limits?
Начал изучать c++ и дали задание посчитать сумму арифметической прогрессии (от 1 до n). Сказали исправить уже существующий код, потому что он считает не все числа до 4 * 10^9 степени. Я заменил int на long long int, но ответ выходил отрицательный, но почему-то если вычитать результат из предела значения long long ( и + 1), то ответ выдает правильный. Отсюда вопрос, почему?, ведь long long больше чем результат суммы арифметической прогрессии.
#include <iostream>
int main() {
int n; / заменено на long long int n
std::cin >> n;
std::cout << n * (n + 1) / 2 << "\n"; / заменено на std::cout << std::numeric_limits<long long>::max() + n * (n + 1ll) / 2ll + 1;
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
long long int n;
std::cin >> n;
std::cout << (n%2 ? (n+1)/2*n : n/2*(n+1)) << std::endl;
Ну, или использовать
unsigned long long int n;
Но первый вариант, так сказать, дидактичнее: учит, как избегать промежуточных переполнений... Например, для 6000000000 просто
unsigned long long int n;
сломается, а вот вариант с делением пополам до умножения — сработает.