平行乘以两个数字

时间:2017-01-15 17:52:11

标签: python

我有两个相同长度的非常大的数字,我想平行相乘。

 e.g.: 1.  [45631] * [10011] = [40031]

       2.[6993123] * [1111000] = [6993000] 

我使用for循环做了这个。

p = input()
q = input()
for i in range(len(p)):
    print(int(p[i])*int(q[i]),end='')

但是我因为超时而陷入困境。有没有办法在O(1)复杂性中做到这一点?

3 个答案:

答案 0 :(得分:1)

不是最漂亮的代码:

def split(num):
    return [int(n) for n in list(str(num))]

def multi(num1, num2):
    return [a*b for a,b in zip(split(num1),split(num2))]

def mainfoo(num1, num2):
    return int("".join([str(num) for num in multi(num1,num2)]))

如果我们使用它:

>>> mainfoo(45631, 10011) 
40031
>>> mainfoo(6993123, 1111000)
6993000

答案 1 :(得分:1)

根据您的评论“One of number would consist of 1s and 0s”,您似乎根本不想“大数字”,而只是将一个字符串与另一个字符串屏蔽,由“1”和“0”组成。您不必转换为int并将其相乘,并且您不必在循环中使用print。试试这个:

>>> p, q = "6993123", "1111000"
>>> ''.join(c if b == "1" else "0" for c, b in zip(p, q))
'6993000'

这应该比你的代码快 ,但它不是O(1)。由于您在字符串中检查了n个不同的字符,因此即使使用并行化(除非您有n个内核),也无法在少于O(n)的情况下执行此操作。

作为参考,这里的性能比较再次成对数字乘法:

>>> %timeit ''.join(str(int(x) * int(y)) for x, y in zip(p, q))
10000 loops, best of 3: 34.6 us per loop
>>> %timeit ''.join(c if b == "1" else "0" for c, b in zip(p, q))
100000 loops, best of 3: 6.32 us per loop

答案 2 :(得分:-1)

如果你超时,我认为列表很大,而不是数字......

如果您在python,请考虑使用numpy.multiply