华为2019校招笔试(9月5号) 1 26进制加法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gsch_12/article/details/82457543

题目 26进制加法:

2大整数相加,每位是小写字母,’a’是0,‘z’是25。求加法的和

输入输出

输入

z
bc
输出
cb
解法: 思路:

ord():返回对应的 ASCII 数值
reverse():反向列表里的元素
chr():将as码转成字符
26进制加法的过程 :
从末尾开始,按位将两数相加,如果和超过26,就需要进位,将和减去26的结果就是该位的结果。
进位要留到下一位的计算里。
可以看到这是一个递归的过程。因为上一个进位要留到下一个位相加里。
所以首先,要满足按位加,要将两个字符串补充成一个长度。
十进制我们是补0,这里是26进制,我们补’a’。
设定函数来计算按位加的过程,输入的两位的字符,输出是相加的结果和进位。这里用ord将字符串转成ascii码再模拟计算的过程。
然后对两个补完长度的字符串,进行按位加,将每一个按位加的结果存在list里, 最后将list的结果反向,并联合起来输出字符串,就是相加的结果。


# #以下只用于测试,输出应该是saeattmdsrdssvtady
# input1 = 'tttzzzasasazzz'
# input2 = 'sadzzzsdssdasdsadz'
#该函数描述了 按位加的26进制加法,输入是两个位的字符,输出是 加完的结果 和 进位
def bitadd(bit1,bit2,next):
    #求出a的asc码,把bit1,bit2转成asc码减去a码的值就能得到26进制里该字符代表的数
    #例如 b应该是1,和a的asc码正好相差1。
    asclow = ord('a')
    asc1=ord(bit1)-asclow
    asc2=ord(bit2)-asclow
    #按位相加后,注意一定还要加进位 ,总和超过26则需要进位1,否则进位0
    result_bit=asc1 + asc2 +next
    temp=result_bit-26
    if(temp>=0):
        #进位为1 
        next=1
        #result_bit的结果等于两位之和与26相减后剩下的值
        result_bit=temp
    else:
        next=0
        #result_bit不变
    #输出结果是26以内的数,要把它转成字符的asc码,一定要记得加'a'的asc码值
    return result_bit+asclow,next
input1=str(input())
input2=str(input())
#首先按长度,将两个数补成位数相同的长度,注意高位用'a'来当0来补全。
len1=len(input1)
len2=len(input2)
if(len1>len2):
    input2='a'*(len1-len2)+input2
    maxlen=len1
else:
    input1='a'*(len2-len1)+input1
    maxlen = len2
#初始化进位的值
next=0
#list用来装按位相加留下的结果
rlist=[]
for i in range(maxlen-1,-1,-1):
    result_bit, next=bitadd(input1[i],input2[i],next)
    #把按位加的数字结果转成字符表示,chr(ascii码)
    rlist.append(chr(result_bit))
#注意,运算到最后一位相加时,如果进位值是1,则要额外添加一位数字1,1对应的字符是b。
if(next==1):
    rlist.append('b')
#注意rlist里装的字符顺序是倒序,所以要翻转后再输出字符串
rlist.reverse()
print(''.join(rlist))

猜你喜欢

转载自blog.csdn.net/gsch_12/article/details/82457543
今日推荐