大数问题

一、目录:

二、题目1:两个大数相乘

有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。

 输入描述:

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

 输出描述:

  输入的乘积,用字符串表示
  示例1
输入
72106547548473106236 982161082972751393

输出
70820244829634538040848656466105986748

思路:https://blog.csdn.net/boguesfei/article/details/81368336

计算的过程基本上和小学生列竖式做乘法相同。为编程方便,并不急于处理进位,而将进位问题留待最后统一处理。
现以 835×49为例来说明程序的计算过程。
先算835×9。5×9得到45个1,3×9得到27个10,8×9得到72个100。由于不急于处理进位,所以835×9算完后,aResult如下:
 
接下来算4×5。此处4×5的结果代表20个10,因此要 aResult[1]+=20,变为:
 
 
再下来算4×3。此处4×3的结果代表12个100,因此要 aResult[2]+= 12,变为:
 
最后算 4×8。此处4×8的结果代表 32个1000,因此要 aResult[3]+= 32,变为:

 
乘法过程完毕。接下来从 aResult[0]开始向高位逐位处理进位问题。aResult[0]留下5,把4加到aResult[1]上,aResult[1]变为51后,应留下1,把5加到aResult[2]上……最终使得aResult里的每个元素都是1位数,结果就算出来了:
 

总结一个规律,即一个数的第i位和另一个数的第j位相乘所得的数,一定是要累加到结果的第i+j位上。这里i, j都是从右往左,从0开始数。
 

代码:

def largeIntMul(num1,num2):
    if not num1 or not num2:
        return -1
    m1 , m2 = len(num1) , len(num2)
    res , tmp = [0]* (m1+m2+1), [0] * (m1+m2)
    n1 = num1 if  m1 > m2 else num2
    n2 = num2 if n1 == num1 else num1
    for i in range(len(n2)):
        for j in range(len(n1)):
            tmp[j+i] += int(n2[i])*int(n1[j])
    a = 0
    for i,t in enumerate(tmp):
        b = (t + a) % 10
        a = (t + a) // 10
        res[i] = b
    res[i+1] = a
    res = list(map(str,res))
    res = ''.join(res[::-1])
    return res.lstrip('0')
if __name__=='__main__':
    num1 , num2 = input().split()
    print(largeIntMul(num1[::-1],num2[::-1]))
 
 
原文地址:https://www.cnblogs.com/Lee-yl/p/10672261.html