找到n可以分成两半的函数

时间:2011-02-22 00:50:41

标签: python

基本上,我需要一个将n除以2的函数,并返回它可以完成的次数。

到目前为止的编码:

def div(n):
    while n >= 0:
        n / 2
    return n

我知道我必须使用while循环,但我对第三行编码没有信心。有人能告诉我我做错了吗?

的示例:

>>> div(4)
2
>>> div(7)
2

8 个答案:

答案 0 :(得分:19)

整数 n 可以除以 2 floor(log(n)/log(2))次。

答案 1 :(得分:8)

/不执行任务。既然你正在返回n而不是改变它的价值,我认为你应该从那里开始。您的其他提示是=和%。

答案 2 :(得分:4)

(请注意,我将您的示例用作定义函数的预期行为。正如Tomas和Carl所说,目前描述并不是特别清楚)

最新版本的Python实际上为整数提供了一个bit_length()方法,可以很容易地找到答案。

虽然这并没有真正帮助你完成你的家庭作业问题(它给你答案,但不能帮助你理解为什么这就是答案),你可以用它来创建一个参考与您的实际答案进行比较的功能:

def expected(n):
    return n.bit_length() - 1

>>> expected(4)
2
>>> expected(7)
2
>>> expected(33)
5

要考虑几点:

  • 您的循环条件不正确,因为重复除法永远不会将值减小到零以下。根据示例数据,您的终止条件需要有所不同。考虑您对012输入所期望的答案。
  • 你需要在每次循环中更改n的值,否则你的循环永远不会结束
  • 真的是n你想要归还的价值吗?也许还有一些你应该跟踪的东西,因为你绕过循环将成为你的返回值(仔细看看其他一些建议的答案应该有助于这一点)。

答案 3 :(得分:0)

我至少看到两种方法

按位运算(shift):

i = 8
result = 0
while i > 1:
    i = i >> 1
    result = result + 1
print result

i = 8
result = 0
while i > 1:
    i = i / 2
    result = result + 1
print result

答案 4 :(得分:0)

解释是,你可以将它减半(丢弃余数)到0;假设32位整数

def div(n):
    while n & (n - 1) > 0:
        n = n & (n - 1)
    a = [0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9]
    tmp = (n * 0x077CB531) % 0x100000000
    if tmp > 0xd0000000:
        tmp += -0x100000000
    return a[tmp >> 27]

示例输出:

   >>>print div(100)
   6
   >>>print div(1000)
   9
   >>>print div(1025)
   10

答案 5 :(得分:0)

这是一个函数,它使用模数计算一个数n除以另一个数p(在本例中为2)的次数:

>>> def dividible(n, p):
...     i = 0
...     while n%p==0:
...             n /= 2
...             i += 1
...     return i
... 
>>> dividible(16, 2)
4
>>> dividible(15, 2)
0
>>> dividible(8, 2)
3
>>> dividible(100, 2)
2

答案 6 :(得分:0)

内部函数divmod是关键:

divmod(20,3)
>>> (6, 2)

divmod(20,3)[0]
>>> 6

答案 7 :(得分:0)

整除性定义如下:一个整数只能被另一个整数整除,前提是该除法的结果也是一个整数(不是分数,没有余数)。

参见mathematical definition

例如,15 可以被 3 和 5 整除,但不能被 2 整除。
鉴于这个定义,上面评价很高的答案,floor(log(n)/log(2) 是完全错误的。

例如:
3^10= 59,049
这个数是奇数,只能被 3 整除。
所以count-2-divisions(3^10) = 0 表达式 floor(log(3^10)/log(2)=15