Вернуть минимум X (который может содержать Y элементов) для произвольного количества элементов - PullRequest
1 голос
/ 27 октября 2010

Чувствую себя довольно мёртвым прямо сейчас. Я могу, конечно, переборщить это, но я чувствую, что имеет , чтобы быть простой функцией для возврата этого числа.Что касается нативных функций, я использую PHP и / или Python.

Например: существуют контейнеры с X (5) хлебными палочками каждый, и мне нужно накормить Y (25) человек Z (3) хлебные палочки каждый.

Мне нужно вернуть количество контейнеров, которые я должен приобрести, чтобы накормить этих людей.(Могут быть или не быть остатки хлебных палочек).

РЕДАКТИРОВАТЬ: Уточнил некоторые намерения.

Ответы [ 6 ]

3 голосов
/ 27 октября 2010

Звучит так, будто вам нужна арифметика:

min_containers = y*z/x

Если у вас есть ситуации, которые могут дать остаток:

min_full_containers = floor(y*z/x)
remaining_items = y*z%x
2 голосов
/ 27 октября 2010
def f(X, Y, Z):
  d, r = divmod(Y * Z, X)
  return d + bool(r)
1 голос
/ 27 октября 2010

В Python используйте // (целочисленное деление по полу, введено в Python 2.2) и принудительно округляйте его:

number_required = y * z
container_holds = x
reqd_containers = (number_required + container_holds - 1) // container_holds

или, если вам нужна так называемая версия "профессионального программиста", вместо этогопояснительной версии:

n=(y*z+(x-1))//x;

или, если вы действительно боитесь синдрома запястного канала, порежьте две лишние скобки и точку с запятой:

n=(y*z+x-1)//x

Примечание: это решениеработает как на Python 2 (где 10 / 3 -> 3), так и на Python 3 (где 10 / 3 -> 3.3333333333333335)

Другие «решения» не только используют ненужные вызовы функций, но и терпят неудачу с большими числами:

# wrong in Python 3; works with Python 2.3 to 2.7
# int overflow with Pythons up to 2.2
>>> int((100000000000000000 + 2)/3)
33333333333333332 # last digit should be 4

# wrong with Python 2.3 onwards; int overflow with earlier versions
>>> import math
>>> int(math.ceil(float(100000000000000000) / 3))
33333333333333332L
1 голос
/ 27 октября 2010

Ответ Неда правильный. Также обычно можно избежать накладных расходов на вызов функции для math.ceil (), выполнив следующее:

minContainers = int((y*z+(x-1))/x);
1 голос
/ 27 октября 2010
#python
import math

int(math.ceil(float(Y) * Z / X))
0 голосов
/ 27 октября 2010

($ people * $ breadSticksPerPerson) / $ holders не правильно?

РЕДАКТИРОВАТЬ: Извините, неправильно прочитал ваш вопрос, отправил правильное решение в комментариях

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...