我有两个相同长度的非常大的数字,我想平行相乘。
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)复杂性中做到这一点?
答案 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。