-1

问题问:

<< 背景故事:假设我们正在为一家新的汉堡店设计一个销售点和订单跟踪系统。这是一家小店,只卖 4 种套餐选择:经典单人套餐(汉堡加一个肉饼)、经典双人套餐和奶酪套餐(2 个肉饼)、经典三人套餐和奶酪套餐(3 个肉饼)、前卫四人套餐和鳄梨酱组合(4 个肉饼)。我们将这些组合分别编码为 1、2、3 和 4。每顿饭都可以大到买一大盒薯条和饮料。对于组合 1、2、3 和 4,大尺寸组合分别由 5、6、7 和 8 表示。>>

编写一个名为 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 份。我猜这是错误的,但我想不出任何东西来代替它。

4

3 回答 3

7

不需要迭代函数,你可以通过“转”成字符串来测量数字的长度:

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
于 2014-01-30T05:17:25.090 回答
4

这个怎么样:

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
于 2014-01-30T05:14:24.123 回答
0

您建议的答案中有几个错误。

  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 whole的次数。

所以对于像 n = 1042 这样的数字,n // 10会给你多少整数乘以 10 适合 1042。

这是 104(因为 1042/10 = 104.2,四舍五入我们有 104)。注意到我们是如何有效地敲掉一个数字的吗?

让我们看看你的while循环。

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

每次一个数字被“敲掉”订单时,大小计数器都会增加,从而计算在你到达终止步骤之前你可以敲掉多少个数字。

当您敲击最后一个(单个)数字时会发生终止。例如,假设您将订单减少到 1(从 1042),然后1 // 10返回 0。

因此,一旦所有数字都被“敲掉”并计数,您的订单将具有 0 值。while 循环将终止,并且您的尺寸计数器将被返回。

希望这可以帮助!


免责声明:也许这不是您想听到的,但许多大学认为从 Internet 复制代码并将其作为您自己的代码冒充是剽窃

于 2016-10-11T13:12:29.410 回答