【问题标题】:Long multiplication of two numbers given as strings以字符串形式给出的两个数字的长乘法
【发布时间】:2019-06-19 14:09:51
【问题描述】:

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

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

  2. 将这两个数字相乘,就像我们以前在学校做的那样。

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

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

我被困在加法点。 我想像下面给出的图片那样做

所以我制作了一个列表,将第一个数字的 ith 数字的值存储到 jth 秒数。请帮我解决加法部分。

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

【问题讨论】:

  • 您可能会发现这很有价值 - RosettaCode Python 任务。
  • @GuyCoder 是的,有一个关于同一问题的链接,但我无法理解,因为所有这些 Python 东西对我来说都是新事物。
  • 所以,如果我理解正确,您的问题可以简化为 1)如何将列表中的元素提高到 10 的幂(1、10、100、...)和 2)如何获得结果列表的总和。这是正确的吗?
  • @Georgy 类似这样的东西。但我想将两个非常大的数字相乘(比如非常大),然后像所示图片一样将它们相乘。我有 ** [1638,1404,1170]** 作为函数调用 mul('234','567') 的结果。我现在无处可去。我应该添加这些数字但卡住了,因为必须为每个列表移动这些数字。例如 1638 应该添加为 16380 + 1404,其中 6 与 4 对齐,3 与 0 对齐,8 与 4 对齐,依此类推。我该如何换班?
  • 图片不正确。您需要注意水平放置。通常,我会用越来越多的零填充。但是您可以将行号添加到索引中。祝你好运。

标签: python python-3.x string multiplication


【解决方案1】:

我认为这可能会有所帮助。我添加了一个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]

【讨论】:

  • 这就是重点。我为每次迭代添加了“0”,从第 2 次开始并将其转换为 int,然后转换为 sum(list)。但我正在研究一个假设场景,如果“数字太大,Python 无法理解它”。这就是我使用这种方法的原因。它的工作原理是将每个字符串字符转换为整数并将其相乘,就像我们在学校在纸上所做的那样。
  • 没有假设的数字 Python 无法处理——尽管您的计算机或操作系统可能会因为内存不足而试图让它处理。我猜我不明白你的“重点”。
  • 我知道没有这样的情况,这就是我使用“假设”的原因。行!所以让我换一种说法 我正在研究一个问题,它模仿/实现两个 2+ 数字的乘法,由学校的孩子们使用 Python 完成
  • @Mahesh 那么,Martin 提供的解决方案的确切问题是什么?
  • @Mahesh 如果是关于打印为列表的结果,只需将print(list(accumulate(list_to_add, operator.add))) 替换为print(sum(list_to_add))
猜你喜欢
  • 2019-07-19
  • 2016-12-20
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
  • 2020-03-31
  • 1970-01-01
  • 2020-08-16
相关资源
最近更新 更多