Python 以十六进制为基数添加数字而不转换基数?

Python 以十六进制为基数添加数字而不转换基数?,python,hex,Python,Hex,我需要写一个函数,以十六进制为基数获取两个数字,并计算它们的和,我不允许将它们转换为十进制,代码应该使用循环“手动”计算。 例如,它应该是这样工作的: 1 1 f 5 (A) + 5 a (B) ------------- = 2 4 f 以下是一个输入示例: 添加(“a5”、“17”) “bc” 我已经开始编写代码,但我被卡住了,我想我会分成三个如果,一个只对数字求和,另一个求和数字和字母,第三个求和字母,但我不知道如何从这里继续: def add_hex(A,B): ls

我需要写一个函数,以十六进制为基数获取两个数字,并计算它们的和,我不允许将它们转换为十进制,代码应该使用循环“手动”计算。 例如,它应该是这样工作的:

 1
 1 f 5  (A) 
+  5 a  (B) 
------------- 
= 2 4 f 
以下是一个输入示例: 添加(“a5”、“17”) “bc”

我已经开始编写代码,但我被卡住了,我想我会分成三个如果,一个只对数字求和,另一个求和数字和字母,第三个求和字母,但我不知道如何从这里继续:

def add_hex(A,B):
lstA = [int(l) for l in str(A)]
lstB = [int(l) for l in str(B)]

if len(A)>len(B):
    A=B
    B=A
A='0'*(len(B)-len(A))+A
remainder=False
result=''
for i in range(len(B)-1)
if (A[i]>0 and A[i]<10) and (B[i]>0 and B[i]<10):
   A[i]+B[i]=result
   if A[i]+B[i]>10:
       result+='1'
def add_hex(A,B):
lstA=[int(l)表示str(A)中的l]
lstB=[int(l)表示str(B)中的l]
如果len(A)>len(B):
A=B
B=A
A='0'*(len(B)-len(A))+A
余数=假
结果=“”
对于范围内的i(透镜(B)-1)
如果(A[i]>0和A[i]0和B[i]10:
结果+='1'

非常感谢您的帮助,我不知道如何开始!

您可以使用一个子函数,将两个单位十六进制数相加,并返回它们的单位总和和进位(0或1)。此函数将接受三个输入:两个要添加的数字和一个进位。然后,您可以循环通过两个要添加的数字的数字,从最低有效到最高有效,并对每对数字应用此函数,同时考虑每个阶段的进位

让我们试试你的例子:

A 5 1 7 + A五 1 7 + 我们从最低有效位5和7开始,并执行1位加法。516+716=1210。1210小于1610,因此1位加法的输出为1210=C16,进位为0

现在我们加上A和1(进位是0,所以我们可以正常地加上它们)。A16+116=1110。1110小于1610,所以我们的1位加法的输出是1110=B16,进位为0。(如果进位为非零,我们只需在这个值上加1。)

因此,我们的总体结果是:

A 5 1 7 + ----- B C A五 1 7 + ----- B C
我想我们只记得加法的模式,比如下面

"0" + "0" = "0"
"0" + "1" = "1"
"0" + "2" = "2"
       .
       .
       .
"f" + "d" = "1b"
"f" + "e" = "1c"
"f" + "f" = "1e"
我们有所有模式的
字典
,因为我们在学校或其他地方学过。我们还学过
携带

所以我认为这看起来像是手动加法算法

  • 记住模式包括携带
  • 算计
    • 将两位数转换为一位数(a+b->c)
    • 正确对待携带
  • 这是我的代码,但可能有点棘手

    import itertools
    
    def add_hex(A,B):
        A = "0"+A
        B = "0"+B
        #Remember all pattern include carry in variable d.
        i2h = dict(zip(range(16), "0123456789abcdef"))
        a = [(i,j) for i in "0123456789abcdef" for j in "0123456789abcdef"]
        b = list(map(lambda t: int(t[0],16)+int(t[1],16), a))
        c = ["0"+i2h[i] if i<16 else "1"+i2h[i-16] for i in b]#list of digit include carry
        d = dict(zip(a,c))#d={(digit,digit):digit,,,}
        #Calculate with variable d.
        result = ""
        cur = "0"
        nex = "0"
        for i in itertools.izip_longest(A[::-1], B[::-1], fillvalue = "0"):
            cur = d[(nex, d[i][1])][1]                   #cur = carry + digit + digit
            if d[i][0]=='1' or d[(nex, d[i][1])][0]=='1':#nex = carry = carry + digit + digit
                nex = "1"
            else:
                nex = "0"
            result += cur
    
        return result[::-1]
    
    #Test
    A = "fedcba"
    B = "012346"
    print add_hex(A,B)    
    print hex(int(A,16)+int(B,16))#For validation
    
    导入itertools
    def添加_十六进制(A,B):
    A=“0”+A
    B=“0”+B
    #记住所有模式都包括进位变量d。
    i2h=dict(zip(范围(16),“0123456789abcdef”))
    a=[(i,j)表示“0123456789abcdef”中的i,表示“0123456789abcdef”中的j]
    b=list(map(lambda t:int(t[0,16)+int(t[1,16,a))
    
    c=[“0”+i2h[i]如果你需要证明你至少做了一些努力,不管多么小。我想我想更详细地看一下规范。从本质上来说,根本不需要将它们转换为十进制,但将它们转换为整数是正常的,即使你必须一次任意处理一个数字。手动
    是什么意思?请描述一下您的
    手动算法
    。由于整数存储在基数2中,我看不出问题:)手动操作,就像人们在纸上手工操作一样,这意味着它应该循环每个数字,并与另一个数字求和,并保存余数(如果有),我已经发布了到目前为止我编写的代码。