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))