我得到了以下数字序列1,2,4,8,16,32,64 .... 8192 - 其中每个数字代表一些东西,如1代表" Milk",和2可以代表" Egg"。
我得到了一个价值为3的蛋糕。由于1 + 2 = 3,我知道我的蛋糕包含牛奶(1)和鸡蛋(2)。
但是 - 我正在寻找一种算法来帮助我实现这一目标。如果总和是1536我希望算法找到1024和512 - 或者,如果总和是7 - 使用的数字将是:1,2,4。
有办法做到这一点吗?
答案 0 :(得分:2)
让我们看看我是否理解,你有一个基本上是“二进制”(2的幂)值的序列,例如:
32 --- 16 --- 8 ---- ---- 4 2 ----- 1
0 ---- 0 ---- 0 ---- 1 ---- 1 ----- 0是6
所以你可以继续将你的输入数字(这是一个int)转换成二进制数,然后一点一点地检查它们是否已经打开。
因此,假设您的数字为35,为二进制:
32 --- 16 --- 8 ---- ---- 4 2 ----- 1
1 ---- 0 ---- 0 ---- 0 ---- 1 1 -----
我现在会一点一点地去。
结果:1 + 2 + 32 = 35
希望这有帮助! :)
答案 1 :(得分:1)
在现代计算机中,整数已经用二进制表示。您可以使用bitwise operations(伪代码)来利用它:
for p := 30 downto 0:
if (x and (1 shl p)) > 0:
output (1 shl p)
例如,假设x = 100 10 = 1100100 2 ,程序将输出64,32和4。
此处,shl
是shift操作,and
是bitwise AND。
答案 2 :(得分:0)
您可以继续使用数字的对数基数2,直到达到可被2 ^整除的数字(该数字的对数基数为2)
示例:
使用Python:
import math
goal = int(raw_input("Enter a goal"))
solution = []
while(goal > 0):
nextExponent = int(math.log(goal)/math.log(2))
goal -= 2**nextExponent
solution.append(2**nextExponent)
print solution
如果您的2级权限有限,则必须最多限制nextExponent
。
示例输入:
输入目标58094
输出:
[32768,16384,8192,512,128,64,32,8,4,2]