以字符串形式给出的两个数字的长乘法

时间:2019-06-19 14:09:51

标签: python python-3.x string multiplication

我正在尝试解决乘法问题。我知道Python支持大量数字,可以做到,但是我想做的是

  1. 输入2个数字作为字符串。

  2. 以与我们在学校相同的方式将这两个数字相乘。

基本思想是将下面链接中给出的代码转换为Python代码,但是我不太擅长C ++ / Java。我想做的是理解下面链接中给出的代码,并将其应用于Python。

https://www.geeksforgeeks.org/multiply-large-numbers-represented-as-strings/

我被卡在加法点上。 我想像下面的图片那样做

enter image description here

因此,我创建了一个列表,其中将第一个数字的 i th 位数字的值存储到 j th 秒数。请帮助我解决加法部分。

def mul(upper_no,lower_no):
    upper_len=len(upper_no)
    lower_len=len(lower_no)
    list_to_add=[]  #saves numbers in queue to add in the end

    for lower_digit in range(lower_len-1,-1,-1):
        q=''  #A queue to store step by step multiplication of numbers
        carry=0

        for upper_digit in range(upper_len-1,-1,-1):
            num2=int(lower_no[lower_digit])
            num1=int(upper_no[upper_digit])
            print(num2,num1)
            x=(num2*num1)+carry
            if upper_digit==0:
                q=str(x)+q
            else:
                if x>9:
                    q=str(x%10)+q
                    carry=x//10
                else:
                    q=str(x%10)+q
                    carry=0
                    num=x%10
        print(q)
        list_to_add.append(int(''.join(q)))
    print(list_to_add)

mul('234','567')

我将[1638,1404,1170]作为函数调用mul('234','567')的结果,我应该添加这些数字,但是由于每个列表都需要移动这些数字而被卡住了。例如,应该将1638添加为16380 + 1404,其中6与4对齐,3与0对齐,8与4对齐,依此类推。喜欢:

    1638
   1404x
  1170xx
--------
  132678
--------

1 个答案:

答案 0 :(得分:0)

我认为这可能会有所帮助。我添加了一个place变量来跟踪每个中间值应乘以10的多少次幂,并使用了itertools.accumulate函数来产生中间的累加和,从而产生中间的累加(并且显示)。

请注意,我还对您的代码进行了重新格式设置,以便使其紧跟PEP 8 - Style Guide for Python Code,以使其更具可读性。

from itertools import accumulate
import operator


def mul(upper_no, lower_no):
    upper_len = len(upper_no)
    lower_len = len(lower_no)
    list_to_add = []  # Saves numbers in queue to add in the end

    place = 0
    for lower_digit in range(lower_len-1, -1, -1):
        q = ''  # A queue to store step by step multiplication of numbers
        carry = 0

        for upper_digit in range(upper_len-1, -1, -1):
            num2 = int(lower_no[lower_digit])
            num1 = int(upper_no[upper_digit])
            print(num2, num1)
            x = (num2*num1) + carry
            if upper_digit == 0:
                q = str(x) + q
            else:
                if x>9:
                    q = str(x%10) + q
                    carry = x//10
                else:
                    q = str(x%10) + q
                    carry = 0
                    num = x%10
        print(q)
        list_to_add.append(int(''.join(q)) * (10**place))
        place += 1

    print(list_to_add)
    print(list(accumulate(list_to_add, operator.add)))


mul('234', '567')

输出:

7 4
7 3
7 2
1638
6 4
6 3
6 2
1404
5 4
5 3
5 2
1170
[1638, 14040, 117000]
[1638, 15678, 132678]