我试图创建一个函数,它接收一个数字作为参数,并对该数字执行操作,以找出它最接近的2的幂,然后将其加起来。例如,如果用户输入4,则函数将追加4,因为它已经是2的幂。如果用户输入14,则函数应看到14不是2的幂,并且构成14的最接近的2的幂是2、4和8。
关键提示:我只会上升到2^9。
到目前为止我所拥有的:
def powers_finder(n):
powers=[]
i=0
total=0
while i<10:
value=2**i
total=total+value
i=i+1
#This if statement is for if the user enters a power of 2 as n
#Then the number will be appended right away into my powers list.
if value==n:
powers.append(value)
这里的问题是,如果用户输入5,假设(n)5由幂2^2=4和2^0=1 4+1=5组成。如何扩展我的功能以包含此过程?
谢谢!
9条答案
按热度按时间ryevplcw1#
下面的二进制解决方案结合了@moose对
enumerate()
的使用、@ gbriones.gdl对stride索引的使用以及@gbriones.gdl关于一行的评论(实际上,这是一个关于 * 不是 * 一行的评论,但是一行很有趣)。41zrol4v2#
当然,最好和最快的方法是使用二进制数,但这里有一种使用生成器的方法:
b5buobof3#
一个简单(但实际上并不有效)的方法是使用回溯。请注意,2的最接近的幂很容易通过使用
math.log
函数找到(n的2的最接近的幂是2^round(log(n, 2))
):输出:
xqk2d5yq4#
这个想法是将数字转换为二进制,然后从二进制表示中获得2的幂:
czq61nw15#
我知道这是旧的,但我相信我已经找到了一个更快的解决方案。
我的代码:
deque.append
比list.append
更高效,我在Python中观察到,for
循环似乎比while
循环更快,int
有一个方法bit_length
,根据定义,它是大于或等于该数字的最接近的2的幂。我测试了我的代码,发现它和公认的答案一样快(或比):
我的代码反汇编:
事实上,我找到了另一个绝对最快的解决方案:
不知何故,如果我处理字符串的顺序,它变得更慢:
不知何故,在整数域中操作比从二进制中提取幂要慢:
8tntrjer6#
与其解决问题,不如提供一些信息来帮助你解决问题?看几个例子,并解决它们。这里有几个,
假设N=2,那么答案是= {2=2^1}。
假设N=3,那么答案是= {2= 2^1,1 =2^0}(注意2**0=1)
假设N=4,则答案为= {4=2^2}
...
假设N=63,则答案= {32=2^5,16=2^4,8=2^3,4=2^2,2=2^1,1=2^0}
假设N=64,则答案为= {64=2^6}
...
假设N=259,则答案为= {256=2^8,2=2^1,1=2^0}
你看出规律了吗?
想要算法吗?
想想这些简单的步骤,然后把它们组合在一起,
你能查一下这个号码是不是奇数吗?当数字是奇数时,则您检测到一个“on”位。减一(使数字为偶数)。
你能除以2吗?你对结果做了什么?
js5cn81o7#
最有效的方法是:
pbgvytdp8#
我们现在对这个问题有了一些很好的答案。我想我应该用
dis
和timeit
来分析一下它们。下面是我使用的测试代码:
结果如下:
从
timeit
的结果中,我们可以看到@nullptr的解决方案非常好,正如我所怀疑的那样,其次是@moose的解决方案。之后是我的@moose和@gbriones.gdl的解决方案的组合,紧接着是@gbriones.gdl的解决方案。我的发电机解决方案,可以说,非常次优,但我有点预料到了。dis
结果包括在内,以确保完整性。avkwfej49#
试试二进制文件: