获取非负整数的位数(Python)

时间:2014-01-30 04:07:13

标签: python numbers digits sizing

问题是:

<<背景故事: 假设我们正在设计一个新汉堡的销售点和订单跟踪系统 联合。这是一个小型联合,它只出售4种组合选项:Classic Single 组合(汉堡配一个小馅饼),经典双人奶酪组合(2个馅饼), 和经典三重奶酪组合(3个馅饼),前卫四重配 Guacamole Combo(4个小馅饼)。我们将这些组合编码为1,2,3和4 分别。每餐都可以大一点,以获得一盒更大的薯条和 喝。一个biggie大小的组合分别由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部分的订单。我猜错了,但我无法想到任何替代它的东西。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

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

  1. else语句和两个return语句的缩进级别应该缩小。
  2. 您的测试者问题表明您应该计算非负整数的数字,而不仅仅是正数(即您的算法必须在0上工作)。
  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
    

    请注意

    • 通过在if条件中使用包含不等式,我允许0进入while循环,就像我任何其他非负数字位数一样。

    • 通过推送第一个return语句,它会在 while循环后执行。因此,在变量 size 中计算订单后,将返回该订单。

    • 通过推回else:,它会在偶数if条件下执行(即传递给order_size(n)的数字为负数时)。

    • 通过推回第二个return,它在语法上是正确的,并且应该包含在else块中。

    现在我们已经照顾好了,让我来解决这个问题:

      

    但我没有得到// 10部分的订单。

    As of Python 3//分区(a.k.a 整数除法)二进制操作。

    它有效地执行标准除法,然后将向下(向负无穷大)舍入到最接近的整数。

    以下是一些可以帮助您的示例。特别要注意最后一个。

    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可以看作是符合n 整体 的次数。

    因此,对于像n = 1042这样的数字,n // 10会给你多少整个次10符合1042。

    这是104(从1042/10 = 104.2,向下舍入我们有104)。 请注意我们如何有效地敲掉一个数字?

    让我们看看你的while循环。

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

    每次数字被击倒&#34; order size 计数器会递增,从而计算出在终止步骤之前可以敲除的位数。

    敲击最终(单个)数字时发生终止。例如,假设您将 order 减少为1(从1042开始),则1 // 10将返回0.

    所以一旦所有的数字被&#34;被淘汰&#34;并计算,您的订单的值为0.然后while循环将终止,并且将返回 size 计数器。

    希望这有帮助!

    免责声明:也许这不是您想要听到的,但许多大学都考虑从互联网上复制代码并将其作为您自己的代码传递给抄袭