Я решал проблему в онлайн-судье, используя C, и я столкнулся с этой проблемой.
Ограничение: t <= 10 9
У меня есть неправильный ответ, когда я объявлял t int int и Answer Accept, когда я объявил это как долгое время.
Решение включает в себя следующий математический расчет:
m = (-3 + sqrt(12*t - 3))/(float)6 ;
Я подумал, что, возможно, 12 * t - 3
хранится в int, хотя и временно, что дает ошибку. Может кто-нибудь скажет мне, прав ли я?
Да. Типы, меньшие, чем int
передаются int
(или unsigned int
) перед вычислениями, но вычисление с int
приводит к новому int
.
Если ваш результат переполнит int
, лучше всего убедиться, что хотя бы один из операндов является типом, достаточно большим для хранения результата.
12 * 1000000000
переполнит int
, что приведет к неправильному ответу.
int
может быть достаточно большим, чтобы вместить это, но обычно это не так.
Если t является int 12*t
, это int int. Вывод типа в выражении C идет снизу вверх. Это означает, что (временный) результат 12 * t сохраняется в 32-битном целочисленном регистре, он переполняется над пределом (который составляет около 2E + 9), и вы получаете неправильный результат. Умный компилятор может предупредить вас об этом, потому что он может вывести из кода, что это произойдет в некоторых случаях.
Если вы объявляете t так long long
, оно имеет диапазон до 2 ^ 63, давая что-то вроде 8E + 18. В этом случае выражение 12*t
набирается long long
и хранится в 64-битном регистре (или в паре из 32 регистров, если ваш компьютер не имеет 64-битных регистров), и выражение дает правильный результат.
t
...