考试的时候第二题调了好久一直是30%,时间复杂度太高,现在想想还是题目分析的不够透彻!
题目大意:有一个大整数,每三位分成一组;把每一组三位数转成二进制数,再连接所有二进制数;二进制数每五位分成一组,每五位二进制数的数值范围为0-31,用0-9-A-V表示。高位到低位连接起来为最后结果。
分析:每个三位数有唯一的编码,每个三位数转成二进制,不会超过2个5位二进制数aaaaa,bbbbb(因为2的10次方=1024),aaaaa其实就是该数对32整除的结果,bbbbb是该数对32取余的结果。这样就不需要二进制数转换再进行分组转换了,直接对原十进制大整数进行除法与取余的操作。
n = int(sys.stdin.readline().strip()) for i in range(n): line = sys.stdin.readline().strip() three_num = list() final = '' while len(line)>0: three_num.append(int(line[-3:])) line = line[:-3] three_num.reverse() for num in three_num: a = num//32 if a<10: final += str(a) else: final += chr(a-10+ord('A')) b = num%32 if b<10: final += str(b) else: final += chr(b-10+ord('A')) if final[0] == "0": final = final[1:] print(final)