我正在尝试解决乘法问题。我知道Python支持大量数字,可以做到,但是我想做的是
输入2个数字作为字符串。
以与我们在学校相同的方式将这两个数字相乘。
基本思想是将下面链接中给出的代码转换为Python代码,但是我不太擅长C ++ / Java。我想做的是理解下面链接中给出的代码,并将其应用于Python。
https://www.geeksforgeeks.org/multiply-large-numbers-represented-as-strings/
我被卡在加法点上。 我想像下面的图片那样做
因此,我创建了一个列表,其中将第一个数字的 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
--------
答案 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]