0

我开始了一门新的算法课程。教授正在尝试用其他规则创建一个乘法算法。

例如,他将我们试图相乘的数字分成两组。x = 3452那么a = 34, b = 52(同样适用于y)。

滑动

据他介绍,基本操作将是:

如果给你两个数字,每个数字只有一个数字。然后你只需将它们乘以一个基本操作并返回结果。

如果这些是非常简单的操作,您将如何计算ac、和递归?adbcbd

4

1 回答 1

0

以下是您为 karatsuba 编写代码(在 python 中)的方式(假设 x 和 y 始终具有相同的偶数位数):

def numDigits(x):
  """
  Returns the number of digits in x
  """
  if x == 0:
    return 1

  digits = 0
  while x >= 1:
    x = int(x / 10)
    digits+=1
  return digits

def multiply(x, y):
  x_digits = numDigits(x)
  y_digits = numDigits(y)

  if x_digits != y_digits:
    return -1                    # not valid

  n = x_digits

  if n == 1:                     # checks if x (and y) are only 1 digit
    return x*y                   # single digit multiplication

  half_n = int(n / 2)

  a = int(x / (10**half_n))
  b = x - (a*(10**half_n))
  c = int(y / (10**half_n))
  d = y - (c*(10**half_n))

  ac = multiply(a, c)
  ad = multiply(a, d)
  bc = multiply(b, c)
  bd = multiply(b, d)

  return (10**n)*ac + (10**half_n)*(ad + bc) + bd



assert multiply(1, 2) == 2
assert multiply(10, 20) == 200
assert multiply(15, 21) == 315
assert multiply(1710, 2450) == 4189500
print("all pass!")

您可以修改代码以允许 x 和 y 具有奇数位数并具有不同的长度,需要做更多的工作。

于 2020-05-31T21:06:02.123 回答