2017-01-15 3 views
0

У меня очень большие два числа с одинаковой длиной, и я хочу умножить их параллельно.Умножение двух чисел параллельно

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

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

Я сделал это, используя для петель.

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

Но я застрял из-за таймаута. Есть ли способ сделать это в O (1) сложности?

+2

что, если у вас есть '44' *' 44', что вы ожидаете? – Psidom

+0

Это не Java – john16384

+0

Это довольно ясно, что он спрашивает. Ему нужна сложность O (1) для решения вышеизложенного. –

ответ

-1

Если вы получите тайм-аут, я предполагаю, что списки большое, а не число ...

Если вы в python, рассмотреть вопрос об использовании numpy.multiply.

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

Но это сложность O (1)? –

+0

Тот же вопрос возник. – Cosmics

+0

@Cosmics: Учитывая, что цифры по своей природе являются двоичными, а не базовыми 10, я не думаю, что решение, которое является менее сложным, возможно. – Christian

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 разных символов для проверки строки, нет способа сделать это менее чем за O (n), даже с распараллеливанием (если у вас нет n ядер).


Для справки, здесь сравнение производительности Agains попарного умножения цифр:

>>> %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 
Смежные вопросы