Длинное умножение двух чисел, заданных в виде строк - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь решить проблему умножения. Я знаю, что 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 голосов
/ 19 июня 2019

Я думаю, что это может помочь. Я добавил переменную place, чтобы отслеживать, на какую мощность 10 каждое промежуточное значение должно быть умножено, и использовал функцию itertools.accumulate, чтобы получить промежуточные накопленные суммы, которые это производит (и хочешь показать).

Примечание. Я также переформатировал ваш код, чтобы он точно соответствовал PEP 8 - Руководство по стилю для кода Python , чтобы сделать его более читабельным.

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...