import sys
def add(n1, n2): #字符串加法
n1 = n1[::-1]
n2 = n2[::-1]
# 补齐到和的最大位数(相加后可能在最后进一位,所以末尾补一个0)
if len(n1)<len(n2):
n2 += '0'
n1 += '0'*(len(n2)-len(n1))
else:
n1 += '0'
n2 += '0'*(len(n1)-len(n2))
carry,sum = 0,''
for i in range(len(n1)):
cur_sum = int(n1[i]) + int(n2[i]) + carry
carry = cur_sum // 10 #carry 是进位值
sum += str(cur_sum % 10)
sum = sum[::-1]
# 如果最前面有零,去掉前面的零
while len(sum)>1 and sum[0]=='0':
sum = sum[1:]
return sum
def muti(x1, x2):
# xi = ['123435',5]分别表示分解后的乘数,后面补0的数量 (12343500000)
len1,len2 = len(x1[0]),len(x2[0])
if len1 > 10:
cut_point = len1//2
x1_0 = [x1[0][:cut_point],x1[1]+len1-cut_point]
x1_1 = [x1[0][cut_point:],x1[1]]
return add(muti(x1_0, x2),muti(x1_1,x2))
if len2 > 10:
cut_point = len2//2
x2_0 = [x2[0][:cut_point],x2[1]+len2-cut_point]
x2_1 = [x2[0][cut_point:],x2[1]]
return add(muti(x1, x2_0),muti(x1,x2_1))
val = str(int(x1[0])*int(x2[0]))
bit = x1[1]+x2[1]
val += '0'*bit
return val
if __name__ == "__main__":
for line in sys.stdin:
n1,n2 = line.split()
print(muti([n1,0], [n2,0]))
举例说明
123456789 * 678987654