【问题标题】:Python adding binary without using decimal formPython添加二进制而不使用十进制形式
【发布时间】:2014-02-22 23:37:52
【问题描述】:

我正在尝试将两个二进制数相加而不将数字转换为十进制形式。这很困难,因为您还必须添加进位。我错过了什么?

def sameSingleLengthAdd(bin1 , bin2):
    if len(bin1) > len(bin2):
        minus = len(bin1) - len(bin2)
        newBin2
        return addAll(bin1, newBin2)
    elif len(bin2) > len(bin1):
        minus1 = len(bin2)- len(bin1)
        newBin1 = '0'*minus1 + bin1
        return addAll(newBin1, bin2)


def singleAdd(int1, int2):
    addThem = int(int1) + int(int2)
    if addThem == 2:
        return '0'
    else:
        return '1'

def addAll(bin1, bin2):
    if len(bin1)== 0:
        return ''
    else:
        return addAll(bin1[:-1], bin2[-1]) + singleAdd(bin1[-1], bin2[-1])

def sameCarryLengthAdd(bin1 , bin2):
    if len(bin1) > len(bin2):
        minus = len(bin1) - len(bin2)
        newBin2
        return carries(bin1, newBin2)
    elif len(bin2) > len(bin1):
        minus1 = len(bin2)- len(bin1)
        newBin1 = '0'*minus1 + bin1
        return carries(newBin1, bin2)
    else: return carries(bin1, bin2)

def carries(bin1, bin2):
    addThem = int(bin1[-1]) + int(bin2[-1])
    if len(bin1) == 0:
        return ''
    elif addThem == 2:
        return carries(bin1[:-1], bin2[:-1]) + '10'
    else:
        return carries(bin1[:-1], bin2[:-1]) + '0'


def addBinary(bin1, bin2):
    carriedBin = sameCarryLengthAdd(bin1, bin2)
    otherNum = sameSingleLengthAdd(bin1, bin2)
    return sameSingleLengthAdd(carriedBin, otherNum )

【问题讨论】:

  • "不将数字转换为十进制形式" - Python 不会将数字转换为十进制来添加它们。事实上,当你给它十进制时,它必须将它转换为二进制才能使用它。
  • “我错过了什么?” - 好吧,我不知道。怎么了?运行此程序时实际发生了什么,它与您的预期有何不同?
  • 我得到一个用于进位的字符串索引错误(bin1[:-1] , bin2[:-1])
  • 我想如果你回去阅读你写的东西,你可能会发现很多错误。例如,第 4 行,newBin2。那应该做什么?您是否在中途因该功能分心而忘记完成编写?

标签: python binary


【解决方案1】:

您的代码在很多方面都被破坏了,从拼写错误到根本不可行的设计。与其逐个指出程序无法运行的所有原因,不如重新设计它。让我们回到小学加法。

如果要添加数字 795 和 224:

  795
 +224
-----
=

你将数字从最后一位添加到第一位:

  795
 +224
-----
=   9

并且当结果不适合单个数字时,您将进位添加到下一个总和:

  1
  795
 +224
-----
=  19

直到你的数字用完为止:

 11
  795
 +224
-----
= 019

 11
  795
 +224
-----
=1019

要在二进制中添加数字,你做同样的事情。您从每个数字的末尾开始,对于每个位置,您添加每个数字的相应数字和进位。您得到的总和决定了结果的相应数字以及用于下一个总和的进位。例如,3 表示结果数字为 1,进位为 1 用于下一个位置。如果其中一个数字在另一个之前用完数字,您就假装它在那里有一个零。当两个输入都没有更多数字并且您没有进位时,您将停止。

在伪代码中,这个算法是

carry = '0'
result = ''
for position from last to first:
    add carry and digits of each number in the current position
    determine carry and result digit from above sum
    add the new digit to the result

【讨论】:

    猜你喜欢
    • 2013-10-26
    • 2016-12-13
    • 2014-09-13
    • 2018-09-02
    • 1970-01-01
    • 2014-12-05
    • 2011-03-03
    • 2021-10-04
    • 2018-06-09
    相关资源
    最近更新 更多