Почему переполнение вывода std :: cout?

0

Я пытаюсь решить простой вопрос о Codeforces (круг № 1 вопрос А). Для 16-го тестового примера мой код получил -270385980 который должен быть 27126743055556, но на моем локальном компьютере я могу получить правильный ответ. На моем компьютере я скомпилировал его в GCC 4.8, а на Codeforces я использовал GCC 4.7.

Как это может быть отрицательное число? Может ли кто-нибудь дать мне подсказку о том, что не так с моим кодом?

Вот мой код:

#include <iostream>
#include <cmath>

int main(int argc, char *argv[]) {
    double m, n, a;
    std::cin >> m >> n >> a;
    long long res = static_cast<long>(ceil(m / a)) * static_cast<long>(ceil(n / a));
    std::cout << res;
    return 0;
}
Теги:

1 ответ

2
Лучший ответ

Следующий номер: 27126743055556 должен быть представлен более 32 бит (длина long на 32-битном процессоре), поэтому long переполняется, и вы получаете отрицательное число.

Вы должны использовать long long в литье.

static_cast<long long>(ceil(m / a))
  • 0
    Спасибо Алекс, это работает! Поэтому, если множитель имеет тип long, результат также будет типом long, поэтому на веб-сайте codeforce он переполнится (тип long на машине codeforce, вероятно, составляет 32 бита?). Даже если я использую переменную типа long long, чтобы поймать результат, он получил только переполненный результат.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню