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的情况