我需要编写一个函数,它以十六进制为基数得到两个数字,并计算它们的总和,我不允许将它们转换为十进制数,代码应该计算它&#34 ;人工"使用循环。 例如,它应该如何工作:
1
1 f 5 (A)
+ 5 a (B)
-------------
= 2 4 f
这是一个输入示例:
>>> add("a5", "17")
' BC'
我开始构建我的代码,但是我被卡住了,我想我会分成三个ifs,一个只能总结数字,其他数字和字母总和,第三个是字母总和,但我不知道#39;知道如何从这里继续:
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'
非常感谢任何帮助,我不知道如何开始这个!
答案 0 :(得分:1)
你可以有一个子函数,它增加两个单位十六进制数,并返回它们的一位数和和一个进位(0或1)。此功能将采用三个输入:您要添加的两个数字和一个进位。然后,您可以循环浏览要从最不重要到最重要的两个数字的数字,并在考虑每个阶段的进位时对每对数字应用此函数。
让我们试试你的例子:
A 5 1 7 +
我们从最低有效数字5和7开始,并执行1位数的加法。 5 16 +7 16 = 12 10 。 12 10 小于16 10 ,因此我们的1位数加法的输出为12 10 = C 16 携带0。
现在我们添加A和1(我们的进位为0,所以我们可以正常添加它们)。 16 + 1 16 = 11 10 。 11 10 小于16 10 ,因此我们的1位数加法的输出为11 10 = B 16 进位为0.(如果我们有一个非零进位,我们只需将1加到此值。)
因此,我们的总体结果是:
A 5 1 7 + ----- B C
答案 1 :(得分:0)
我想我们只记得添加的模式。喜欢以下。
"0" + "0" = "0"
"0" + "1" = "1"
"0" + "2" = "2"
.
.
.
"f" + "d" = "1b"
"f" + "e" = "1c"
"f" + "f" = "1e"
我们有dictionary of all of the pattern
因为我们在学校或某个地方学过它。我们还学会了carry
。
所以我认为这看起来像手动添加算法。
这是我的代码。但这可能有点棘手。
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
我希望它有所帮助。 :)