Пожалуйста, проверьте еще раз - он расширяется до l + r/2 - l/2
, что составляет l/2 + r/2
.Обратите внимание, что мы не можем просто использовать l/2 + r/2
, поскольку будет целочисленное усечение, поэтому 3/2 + 5/2
= 1 + 2
= 3
, но требуемое значение равно 4
.
Предположим, что оба значения l
и r
являются положительными значениями типа int
.
Если мы имеем:
int l = INT_MAX - 2;
int r = INT_MAX;
Тогда l + r
part is INT_MAX - 2 + INT_MAX
, что является целочисленным переполнением.INT_MAX - 2 + (INT_MAX - (INT_MAX - 2))/2
не имеет целочисленных переполнений, так как каждое подвыражение остается между INT_MIN
и INT_MAX
.
Да, это опечатка!