Допустим есть a//b, у которого результат округляется вверх. Это равносильно (a - 1)//(b - 1)
Я не могу понять, почему оно так?
Может вы имели в виду: (a-1)/b+1 ?
Да, я перепутал. Как вы сказали (a - 1) / (b + 1) Вопрос: почему это так?
Потому что это, очевидно, не так? a=7, b=2; a/b=3.5, ceil(a/b) = 4, (a-1)/(b+1) = 2. И ни одно из (a[+-]1)/(b[+-]1) — не так. Единственная правильная формула — floor((a+b-1)/b), оно же (a+b-1)//b.
Ладно, я понял, что это действительно не то. Просто в одном ресурсе разбора задач говорилось, что это действительно так(видимо я не совсем это правильно понял). В любом случае мне интересно, почему?
Что именно? Почему (a+b-1)//b округляет вверх? Разберите два варианта — a делится на b без остатка и с остатком m (0 < m < b), что должно получатся от округления вверх и от деления (a + b - 1) на b
У вас лишние скобки. Единица должна добавляться после деления. (a-1)/b+1 что по сути равносильно (a+b-1)/b Если из второго уравнения вынести "b" за скобки - получим первое. Скорее всего за этой формулой стоит математическая теория, но логика тут очень простая, на самом деле. Эта формуля полезна когда нужно провести целочисельно деление чисел близких к лимитам, так как перевод к числу с плавающей точкой может сожрать несколько порядков.
Обсуждают сегодня