如何在不转换进制的情况下相加十六进制数?
我需要写一个函数,这个函数可以接收两个十六进制的数字,然后计算它们的和。注意,我不能把它们转换成十进制,代码需要通过循环“手动”计算。
比如说,这个函数应该这样工作:
1
1 f 5 (A)
+ 5 a (B)
-------------
= 2 4 f
这里有一个输入的例子:
>>> add("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'
任何帮助都非常感谢,我完全不知道该从哪里开始!
2 个回答
1
我觉得我们只需要记住加法的规律。就像下面这样。
"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
希望这能帮到你。:)
1
你可以创建一个小功能,用来把两个单个的十六进制数字相加,并返回它们的和和一个进位(进位可以是0或1)。这个功能需要三个输入:你想要相加的两个数字和一个进位。然后,你可以从最不重要的数字开始,逐位处理这两个数字,逐个应用这个功能,同时在每一步都考虑进位。
那么我们来试试你的例子:
A 5 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