s1,s2 = input().split()
ret = [0 for _ in range(len(s2)+len(s1))]
for x in range(len(s2)):
for y in range(len(s1)):
ret[x+y+1] += int(s2[x])*int(s1[y])
for i in range(len(ret)-1,0,-1):
ret[i-1] += ret[i]//10
ret[i] %= 10
if ret[0]==0:
del ret[0]
print(''.join(map(str,ret)))
num1, num2 = input().strip().split()
import sys s=sys.stdin.readline().strip().split() def karatsuba_mul(num1, num2): #karatsuba算法 if len(str(num1))==1 or len(str(num2))==1: return num1*num2 n=max(len(str(num1)),len(str(num2))) half=n//2 a=num1//10**half b=num1%10**half c=num2//10**half d=num2%10**half ac=karatsuba_mul(a,c) #计算a*c bd=karatsuba_mul(b,d) #计算b*d abcd=karatsuba_mul(a+b,c+d) #计算(a+b)*(c+d) adbc=abcd-ac-bd return ac*10**(2*half)+adbc*10**half+bd print(str(karatsuba_mul(int(s[0]), int(s[1]))))
str2int=map(int,input().split())
s=[]
for i in str2int:
s.append(i)
out=s[0]*s[1]
print(str(out))
s1,s2=input().split()
l1,l2=len(s1),len(s2)
rdct={}
for i in range(len(s2)):
for j in range(len(s1)):
rdct[i+j]=rdct.get(i+j,0)+int(s2[-1-i])*int(s1[-1-j])
# check it
while(True):
sign=True # 希望循环过后,每一位的值都是个位数,Allow to exit
for i in list(rdct.values()):
if(i>9):
sign=False # exit forbidden
#print(rdct)
break
if(sign):
break
for i in list(rdct.keys()):
tmp=rdct[i]
if(tmp>9):
rdct[i]=tmp%10
rdct[i+1]=(rdct.get(i+1,0)+tmp//10)
### print process
maxN=max(rdct.keys())
res=""
for i in range(maxN+1):
res=str(rdct.get(i,0))+res
print(res)
from _functools import reduce
a,b =input().split(" ")
blen=len(b)
temlist=[] #存放中间值,也就是一个数从后面开始,每位乘上另一个数得到的值
while(blen>0):
blastn=int(b[blen-1])
alen=len(a)
carry=0
result=""
while(alen>0):
tem=int(a[alen-1])*blastn+carry
carry=tem//10
curr=tem%10
result=str(curr)+result
alen-=1
#刚开始这个判断没有加,导致半天没找出来哪错了,因为测试一些小的数,结果是正确的,
#换成示例,就错了,原来是不加的话,每一次末位乘上另一个数计算的结果没有进位是正确的
#如果进位不为0,那么计算的中间结果就去掉了最高位
if(alen==0 and carry!=0):
result=str(carry)+result
blen-=1
temlist.append(result)
for i in range(len(temlist)):
temlist[i]=temlist[i]+i*"0"
#print(temlist)
def additem(str1,str2):
maxlen=max(len(str1),len(str2))
if len(str1)<len(str2):
str1=(len(str2)-len(str1))*"0"+str1
if len(str1)>len(str2):
str2=(len(str1)-len(str2))*"0"+str2
carry=0
result=""
while(maxlen>0):
tem=int(str1[maxlen-1])+int(str2[maxlen-1])+carry
carry=tem//10
curr=tem%10
result=str(curr)+result
#print(tem,carry,curr,result)
maxlen-=1
if(maxlen==0 and carry!=0):
result=str(carry)+result
#print(result)
return result
product=reduce(additem, temlist)
print(product)
主要思想:类比人的手工计算,从一个数后面开始,每次计算最后一个数和另个一个数的乘积,得到中间结果,在把中间结果加起来。
Python版:通过十进制的运算,并且注意到十进制中可能发生的连续进位问题(不然可能通过率很低),欢迎大家指正问题!
时间:40ms 内存:3568K
#创建指定大小的一维空数组
def kong(num):
s=[]
for i in range(num):
s.append(0);
return s
#十进制计算方法
def jinzhi(a,b):
cz=a+b;
if cz>= 10:
return [cz-10,1]
else:
return [cz,0]
#十进制中有连续进位,设置递归进行运算
def jinzhi2(c,i,j):
m=c[i+j]+1;
if m!=10:
c[i + j]=m;
else:
c[i+j]=0;
jinzhi2(c,i,j-1);
#主程序
def bignum_multi(cc):
dd = cc.split(' ');
a = dd[0];
b = dd[1];
m = len(a);
n = len(b);
p = m + n;#两个数相乘的位数为m+n-1或者m+n
c = kong(p);
#主程序
for i in range(n - 1, -1, -1):
for j in range(m - 1, -1, -1):
k = int(b[i]) * int(a[j]);
k1 = k // 10;
k2=k - k1 * 10;
t = jinzhi(c[i+j+1],k2);
c[i + j +1]=t[0];
if t[1] == 1:
jinzhi2(c, i, j);
t = jinzhi(c[i + j], k1);
c[i + j] = t[0];
if t[1] == 1:
jinzhi2(c, i, j-1);
#数组转成字符串
mm = "";
if c[0] == 0:
for i in range(1, p):
mm = mm + str(int(c[i]));
else:
for i in range(p):
mm = mm + str(int(c[i]));
print(mm)
cc=input();
bignum_multi(cc);
# coding=utf-8
def fun(l):
num0,num1 = l[0],l[1]
result = 0
# 还原乘法的过程,按位相乘再乘以位数权重
for i in range(len(num0)):
for j in range(len(num1)):
# 注意计算位数权重时,index越大位数越小
result += int(num0[i])*int(num1[j])*pow(10,len(num0)-1-i+len(num1)-1-j)
return (str(result))
if __name__=='__main__':
s = raw_input()
l = s.split(' ')
print(fun(l))