Получение количества цифр неотрицательных целых чисел (Python)

Вопрос спрашивает:

‹---------------- ПРЕДПОСЫЛКИ: Предположим, мы разрабатываем кассу и систему отслеживания заказов для новой закусочной с гамбургерами. Это небольшое заведение, в котором продаются только 4 варианта комбо: Classic Single Combo (гамбургер с одной котлетой), Classic Double With Cheese Combo (2 котлеты) и Classic Triple with Cheese Combo (3 котлеты), Avant-Garde Quadruple с Гуакамоле Комбо (4 котлета). Мы будем кодировать эти комбинации как 1, 2, 3 и 4 соответственно. Каждый прием пищи может быть такого большого размера, чтобы можно было получить большую коробку картофеля фри и напитков. Комбо большого размера представлено 5, 6, 7 и 8 соответственно для комбинаций 1, 2, 3 и 4 соответственно. >>

Напишите итеративную функцию с именем order_size, которая принимает порядок и возвращает количество комбинаций в этом порядке. Например, order_size (237) -> 3.

При этом я должен был

order_size(0) = 0

order_size(6) = 1

order_size(51) = 2

order_size(682) = 3

Мой код:

def order_size(order):

    # Fill in your code here
    if order > 0:
        size = 0
        while order > 0:
            size +=  1
            order = order // 10
            return size
        else:
            return 0

Но я не получаю порцию заказа // 10. Я предполагаю, что это неправильно, но я не могу придумать ничего, что могло бы заменить это.


person user3251511    schedule 30.01.2014    source источник
comment
Во-первых, ноль - это одна цифра! Во-вторых, как насчет отрицательных чисел? двойной ? и в-третьих, о каком языке программирования вы говорите?   -  person Nir Alfasi    schedule 30.01.2014
comment
Это Python, и в этом вопросе нет отрицательных чисел. (Это похоже на базовые упражнения)   -  person user3251511    schedule 30.01.2014
comment
Я понятия не имею, чего вы пытаетесь достичь, но while / else, вероятно, не означает того, чего вы ожидаете, и ваш цикл всегда будет выполняться ровно один раз, если он вообще будет достигнут. Что такое комбо?   -  person Wooble    schedule 30.01.2014


Ответы (3)


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

num = 127
order = len(str(num))
print(order) # prints 3

Но если вы действительно хотите сделать это итеративно:

def order(num):
    res = 0
    while num > 0:
        num = int(num / 10)
        res += 1
    return res

print(order(127))  # prints 3
person Nir Alfasi    schedule 30.01.2014
comment
Согласно спецификациям OP: len(str(num)) if num > 0 else 0. - person Hyperboreus; 30.01.2014
comment
@Hyperboreus в соответствии с моим комментарием выше: количество цифр в числе ноль равно единице. :) - person Nir Alfasi; 30.01.2014
comment
Большое спасибо! Но не могли бы вы объяснить, что такое num = int (num / 10) res + = 1? - person user3251511; 30.01.2014
comment
res подсчитывает количество цифр, а num = int(num / 10) удаляет цифру из числа на каждой итерации. - person Nir Alfasi; 30.01.2014

Как насчет этого:

from math import log

def order_size(order):
    if order <= 0: return 0
    return int(log(order, 10) + 1)

Некоторые образцы (порядок левого столбца, размер правого столбца):

0 0
5 1
10 2
15 2
20 2
100 3
893 3
10232 5
person Hyperboreus    schedule 30.01.2014
comment
Лучше поставить +1 снаружи, может помешать приведение типа. - person Ciro Santilli 新疆再教育营六四事件ۍ 19.12.2014

В предложенном вами ответе есть пара ошибок.

  1. Оператор else и оба оператора return должны иметь меньший отступ.
  2. Ваши вопросы тестировщика показывают, что вы должны считать цифры для неотрицательных целых чисел, а не только положительных (т.е. ваш алгоритм должен работать с 0).

Вот моя предложенная альтернатива, основанная на ваших критериях и критериях задачи.

def order_size(order):

    # Fill in your code here
    if order >= 0:
        size = 0
        while order > 0:
            size +=  1
            order = order // 10
        return size
    else:
        return 0

Заметь

  • Используя инклюзивное неравенство в условии if, я разрешаю 0 входить в цикл while, как и любое другое неотрицательное однозначное число.

  • Нажимая назад первый оператор return, он выполняет после цикла while. Таким образом, после подсчета заказа в переменной size он возвращается.

  • При нажатии else: назад он выполняется в том случае, если условие if не выполняется (т.е. когда числа, переданные в order_size (n), отрицательны).

  • Если отодвинуть вторую return назад, она синтаксически верна и содержится в блоке else, как и должно быть.

Теперь, когда об этом позаботились, позвольте мне обратиться к следующему:

Но я не получаю порцию заказа // 10.

Начиная с Python 3, // является разделением этажа (также известное как целочисленное деление) двоичная операция.

Он эффективно выполняет стандартное деление, а затем округляет вниз (в сторону отрицательной бесконечности) до ближайшего целого числа.

Вот несколько примеров, которые могут вам помочь. Обратите особое внимание на последнее.

10 // 2      # Returns 5 since 10/2 = 5, rounded down is 5
2 // 2       # Returns 1 since 2/2 = 1, rounded down is 1
11 // 2      # Returns 5 since 11/2 = 5.5, rounded down is 5
4 // 10      # Returns 0 since 4/10 = 0.4, rounded down is 0
(-4) // 10   # Returns -1 since (-4)/10 = -0.4, rounded down is -1

Для неотрицательного числителя n n // d можно рассматривать как количество раз, когда d вписывается в n целое.

Таким образом, для такого числа, как n = 1042, n // 10 даст вам, сколько целых умноженных на 10 умещается в 1042.

Это 104 (поскольку 1042/10 = 104,2, и округляя в меньшую сторону, получаем 104). Обратите внимание, как мы эффективно отбили цифру?

Давайте посмотрим на ваш цикл while.

while order > 0:
    size +=  1
    order = order // 10

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

Прекращение происходит при выбивании последней (единственной) цифры. Например, вы уменьшили order до 1 (с 1042), тогда 1 // 10 вернет 0.

Итак, как только все цифры будут "выбиты" и подсчитаны, ваш заказ будет иметь значение 0. Цикл while завершится, и будет возвращен ваш счетчик size .

Надеюсь это поможет!


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

person Mathmagician    schedule 11.10.2016