一、目录:
二、题目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,变为:
现以 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]))