计算序列中使用的数字

时间:2014-03-15 14:57:26

标签: algorithm sequence

我得到了以下数字序列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。

有办法做到这一点吗?

3 个答案:

答案 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打开,所以我有1!
  • 位索引2已打开,因此我有2个!
  • 比特索引3关闭,跳过!
  • 位索引4关闭,跳过!
  • 比特索引5关闭,跳过!
  • 比特索引6打开,我有32!

结果: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。

此处,shlshift操作,andbitwise AND

答案 2 :(得分:0)

您可以继续使用数字的对数基数2,直到达到可被2 ^整除的数字(该数字的对数基数为2)

示例:

  • 1536
  • log_2(1536)= 10(所以,将2 10 = 1024添加到您的列表中)
  • 余数= 1536 - 1024 = 512
  • log_2(512)= 9(因此,将2 9 = 512添加到您的列表中)
  • 余数= 512 - 512 = 0
  • 所以你的列表包含1024和512

使用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]