基本上,我需要一个将n除以2的函数,并返回它可以完成的次数。
到目前为止的编码:
def div(n):
while n >= 0:
n / 2
return n
我知道我必须使用while循环,但我对第三行编码没有信心。有人能告诉我我做错了吗?
的示例:
>>> div(4)
2
>>> div(7)
2
答案 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
要考虑几点:
0
,1
或2
输入所期望的答案。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)
整除性定义如下:一个整数只能被另一个整数整除,前提是该除法的结果也是一个整数(不是分数,没有余数)。
例如,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
。