In [72]:
def digit_mult_digit(digit1, digit2, carry):
    assert (digit1 < 10 and digit2 < 10), "Enter digits please"
    mult = digit1 * digit2 + carry
    return mult % 10, mult // 10

def get_nth_digit(number, n):
    return number // (10 ** n) % 10

def digit_mult_number(digit, number):
    i = 0
    cumsum = 0
    carry = 0
    while number // 10 ** i > 0:
        nth_digit = get_nth_digit(number, i)
        answer, carry = digit_mult_digit(nth_digit, digit, carry)
        cumsum += answer * (10 ** i)
        i += 1
    return cumsum + carry * (10 ** i)

def number_mult_number(number1, number2):
    i = 0
    cumsum = 0
    while number2 // 10 ** i > 0:
        nth_digit = get_nth_digit(number2, i)
        cumsum += digit_mult_number(nth_digit, number1) * (10 ** i)
        i += 1
    return cumsum

In [76]:
import numpy as np

In [83]:
# Tests
n = 100
ceiling = 1000
results = [
    number_mult_number(number1, number2) == number1 * number2
    for number1 in np.random.randint(1, ceiling, n)
    for number2 in np.random.randint(1, ceiling, n)
]
np.all(results)


Out[83]:
True

In [ ]: