Python中反转列表表示的两个二进制数的总和

时间:2017-11-27 17:45:02

标签: python algorithm binary

你能帮助我做到这一点吗?我在反向列表中有一个二进制表示的数字。伴随函数bn可用于创建编码数字。

我想通过carry方法添加两个二进制数,但我无法正确使用,而且代码变得混乱。限制是人们只能在算法上使用布尔运算符和列表拼接。

# encode binary form of the number, not part of the algo
def bn (n):
  return list(reversed(list(map(lambda x: 1 if x == "1" else 0, "{0:b}".format(n)))))

# main algo to sum two binary numbers
def s(m, n):
  def _ (a, b, c):
    if a and b:
      return [0 if (0 if a[0] == b[0] else 1) == c else 1] + \
             _(a[1:], b[1:], 1 if (c and (a[0] or b[0])) or (a[0] and b[0]) else 0)
    if a:
      return [0 if a[0] == c else 1] + ([1]+a[2:] if c else a[1:])
    if b:
      return [0 if b[0] == c else 1] + ([1]+b[2:] if c else b[1:])
    return [1] if c else []
  return _(m, n, 0)

print(bn(2017), bn(3), s(bn(2017), bn(3)), bn(2017+3))

此处为s(bn(2017), bn(3))

[0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1]

bn(2017+3))

不匹配
[0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1]

应该如此。

所以我请求帮助来纠正代码,加上你能做出的任何优化都会受到赞赏。

加成

要测试基本情况,可以使用以下内容:

for i in range(0, 12, 2):
  for j in range(0, 12, 3):
    x, y = bn(i+j), s(bn(i), bn(j))
    print(x == y, bn(i), bn(j), "%s + %s = %s %s -> %s" % (i, j, i+j, x, y))

但要注意,这并没有抓住我上面提到的2017 + 3的问题......

0 个答案:

没有答案