网易互娱笔试题 两个不同进制的串分离

dict = {"A":10, "B":11, "C": 12, "D":13, "E":14, "F":15}

def conversion_numbers(num_str, con):
    if len(num_str) <= 0:
        return 0
    Sum = 0
    for i in range(len(num_str)):
        if num_str[i] not in dict:
            Sum = Sum*con + int(num_str[i])
        else:
            Sum = Sum * con + dict[num_str[i]]
    return Sum


if __name__ == "__main__":
    #num_str = '110111'
    #print("10进制: 55")
    num_example = int(input())
    for i in range(num_example):
        str_lst = input().split()
        con1, con2, string = int(str_lst[0]), int(str_lst[1]), str_lst[2]
        len_str = len(string)
        len_half = int(len_str/2)
        str1 = string[: len_half]
        str2 = string[len_half: ]


        str2_begin_position = len_half
        len_str1 = len(str1)
        len_str2 = len(str2)
        Sum_str1 = conversion_numbers(str1, con1)
        Sum_str2 = conversion_numbers(str2, con2)

        count = 0
        while True:
            if Sum_str1 == Sum_str2:
                print(Sum_str1)
                break
            elif Sum_str1 > Sum_str2:
                if str1[-1] in dict:
                    last = dict[str1[-1]]
                else:
                    last = int(str1[-1])

                Sum_str1 = int((Sum_str1 - last)/con1)
                Sum_str2 = Sum_str2 + pow(con2, len_str2)*last
                str2 = str1[-1] + str2 #update str1, str2
                str1 = str1[: -1]
                len_str2 += 1
                len_str1 -= 1
            elif Sum_str1 < Sum_str2:
                if str2[0] not in dict:
                    front = int(str2[0])
                else:
                    front = dict[str2[0]]
                Sum_str1 = Sum_str1*con1 + front
                len_str1 += 1
                Sum_str2 = Sum_str2 - front*pow(con2, len_str2-1)
                len_str2 -= 1
                str1 = str1 + str2[0]
                str2 = str2[1:]
            if len_str1 == 0 or len_str2 == 0:
                print(0)
                break
            count += 1
            if count == 64:
                print("failed")
                break
'''
3
5 2 113221101000101
13 7 1016
4 12 2222248A
'''

想法是从中间切断字符串,左右纪委两个不同进制数sum_str1,sum_str2

如果 sum_str1 > sum_str2:说明切分字符串的枢轴应该左移,则直接对sum_str1执行先减后除操作,对sum_str2执行加和操作

同理可求 sum_str1 < sum_str2的情况

猜你喜欢

转载自blog.csdn.net/z2539329562/article/details/82533307