首页 > 试题广场 >

大整数相乘

[编程题]大整数相乘
  • 热度指数:37640 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。

输入描述:
空格分隔的两个字符串,代表输入的两个大整数


输出描述:
输入的乘积,用字符串表示
示例1

输入

72106547548473106236 982161082972751393

输出

70820244829634538040848656466105986748
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)))
编辑于 2019-05-14 14:16:15 回复(0)
 num1, num2 = input().strip().split()
s1 = list(num1)
s2 = list(num2)
if len(s1) < len(s2):
    min_list = s1
    max_list = s2
else:
    min_list = s2
    max_list = s1
min_length = len(min_list)
max_length = len(max_list)
#print(min_list, max_list)
ls_sum = []
for i in range(min_length-1, -1, -1):
    c = 0 # c为进位数
    ls = []
    for j in range(max_length-1, -1, -1):
        #a是个位数的乘积
        a = int(min_list[i]) * int(max_list[j]) + c
        b = a % 10 # b为取余数
        ls.append(b)
        c = a // 10
        if j == 0:
            ls.append(c)
    ls.reverse()
    ls_sum.append(ls)
for i in range(len(ls_sum)):
    for j in range(i):
        ls_sum[i].append(0)
    for k in range(len(ls_sum)-i-1):
        ls_sum[i].insert(0, 0)
    ls_sum[i].reverse()
#print(ls_sum)
# l = len(ls_sum)
# for i in range(l):
#     sum = 0
#     for j in range(len(ls_sum)):
#         sum += a[j][i]
#     b = sum % 10
a = ls_sum[0]
for i in range(len(ls_sum)-1):
    b = ls_sum[i+1]
    m = 0
    ls1 = []
    for j in range(len(a)):
        s = a[j] + b[j] + m
        n = s % 10
        ls1.append(n)
        m = s // 10
        if j == (len(a)-1) and m != 0:
            ls1.append(m)
    a = ls1
a.reverse()
for i in range(len(a)):
    a[i] = str(a[i])
t = ''.join(a).lstrip('0')
print(t)
发表于 2019-03-29 21:25:11 回复(0)
a1 = input()
a2 = map(int,a1.split())
a3 = list(a2)
print(a3[0]*a3[1])
发表于 2019-03-23 17:55:21 回复(0)
a = input().split(' ')
print(str(int(a[0]) * int(a[1])))

发表于 2019-03-19 11:07:09 回复(0)
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]))))


编辑于 2019-03-18 19:49:42 回复(2)
str2int=map(int,input().split())
s=[]
for i in str2int:
    s.append(i)
out=s[0]*s[1]
print(str(out))

发表于 2019-03-16 15:53:10 回复(0)
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)

发表于 2019-03-10 22:42:35 回复(0)
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)
主要思想:类比人的手工计算,从一个数后面开始,每次计算最后一个数和另个一个数的乘积,得到中间结果,在把中间结果加起来。
发表于 2019-03-03 02:50:01 回复(0)

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);
发表于 2019-02-28 19:15:34 回复(0)

python

a, b = map(int, input().split())
print(a * b)
发表于 2019-02-24 15:29:43 回复(3)
def reverse_str(source_str):
    return source_str[::-1]

def reverse_list(mylist):
    length = len(mylist)
    for i in range(0, int(length/2)):
        temp = mylist[i]
        mylist[i] = mylist[length-1-i]
        mylist[length-1-i] = temp
    if mylist[0] == 0:
        return mylist[1:]
    return mylist

def multiplication_character(str1, char, index):
    result = []
    for i in range(0, index):
        result.append(0)
    tt = int(char)
    carry  = 0
    str1 = reverse_str(str1)
    for i in range(0, len(str1)):
        res = int(str1[i])*tt + carry
        if res >= 10:
            carry = int(res/10)
            result.append(res - 10*carry)
        else:
            carry = 0
            result.append(res)
    result.append(carry)
    return result

def addition_list(pre_list, beh_list):
    if len(pre_list) == 0:
        return beh_list
    result = []
    _len = len(beh_list)
    _len_pre = len(pre_list)
    carry = 0
    for i in range(0, _len):
        if i < _len_pre:
            res = pre_list[i] + beh_list[i] + carry
            if res >= 10:
                carry = int(res/10)
                result.append(res - 10*carry)
            else:
                carry = 0
                result.append(res)
        else:
            res = beh_list[i] + carry
            if res >=10:
                carry = int(res/10)
                result.append(res-carry*10)
                result.append(carry)
            else:
                result.append(res)
    return result

def multiplication_string(str_1,str_2):
    len_beh = len(str_2)
    str_2 = reverse_str(str_2)
    result = []
    for i in range(0, len_beh):
        res = multiplication_character(str_1, str_2[i], i)
        result = addition_list(result, res)
    result = reverse_list(result)
    _result = ""
    for i in range(0, len(result)):
        _result += str(result[i])
    return _result
if __name__ == '__main__':
    number1, number2 = input().split(' ')
    if (number1[0]=='-' and number2[0]=='-') or (number1[0]!='-' and number2[0]!='-'):
        print(multiplication_string(number1, number2))
    else: 
        print('-'+multiplication_string(number1, number2))
题目的意思是不能用python自带的大数,所以中间结果也不能有大数,全程需要用字符串来计算。题目的测试用例里没有设负数,只需要简单判断一下就行
(1)字符串+列表实现
(2)全部是10以内乘法
发表于 2019-02-01 14:09:37 回复(0)
# 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))
    

发表于 2019-01-15 16:03:15 回复(1)