通过加法模拟乘法的算法

时间:2011-07-05 03:55:38

标签: algorithm multiplication addition

如何设计算法以通过加法来模拟乘法。输入两个整数。它们可能是零,正面或负面。

6 个答案:

答案 0 :(得分:9)

def multiply(a, b):                                                                                                                                                               
    if (a == 1):
        return b
    elif (a == 0):
        return 0
    elif (a < 0):
        return -multiply(-a, b)
    else:
        return b + multiply(a - 1, b)

答案 1 :(得分:1)

一些伪代码:

function multiply(x, y)
  if abs(x) = x and abs(y) = y or abs(x) <> x and abs(y) <> y then sign = 'plus'
  if abs(x) = x and abs(y) <> y or abs(x) <> x and abs(y) = y then sign = 'minus'

 res = 0
 for i = 0 to abs(y)
  res = res + abs(x)
 end

 if sign = 'plus' return res
    else return -1 * res

end function

答案 2 :(得分:1)

val:= 0
bothNegative:=false

if(input1 < 0) && if(input2 < 0)
  bothNegative=true
if(bothNegative)
  smaller_number:=absolute_value_of(smaller_number)
for [i:=absolute_value_of(bigger_number);i!=0;i--]
do val+=smaller_number

return val;

答案 3 :(得分:0)

    mul(a,b)
    {
    sign1=sign2=1;
    if(a==0 || b==0)
return 0;
if(a<0){
    sign1=-1;
    a=-a;
    }
    if(b<0){
    sign2=-1;
    b=-b;
    }
    s=a;
    for(i=1;i<b;i++)
    s+=a;
    if(sign1==sign2)
    return s;
    else
    return -s;
    }

答案 4 :(得分:0)

对于整数来说这是怎么回事:

pgjdbc {
com.sun.security.auth.module.Krb5LoginModule required
refreshKrb5Config=true
doNotPrompt=true
useTicketCache=true
renewTGT=true
useKeyTab=true
keyTab="c:/<locationto>/<user>.keytab"
debug=true
client=true
principal="<user>@<domain>";

答案 5 :(得分:0)

我到达这里是因为我一直在寻找不使用*操作的乘法算法。我在这里看到的只是n次的加法或减法。 O(n)没关系,但是...

如果您进行了bitwise shift个运算,则可以得到 O(log n)乘法算法。

这是我的伪代码:

function mul(n, x)
    if n < 0 then   # 'n' cannot be negative
        n := -n
        x := -x
    endif

    y := 0
    while n != 0 do
        if n % 2 == 0 then
            x := x << 1     # x := x + x
            n := n >> 1     # n := n / 2
        else
            y := y + x
            x := x << 1     # x := x + x
            n := n - 1      # n := (n-1)/2
            n := n >> 1
        endif
    endwhile

    return y                # y = n * x
end

请记住,上述 mul(1000000, 2)的功能为O(log 1000000),而 mul(2, 1000000)的功能仅为O(log 2)

当然,您将获得相同的结果,但请记住,函数调用中参数的顺序确实很重要。

编辑:使用n % 2的注解

使用n % 2实现bitwise shift

这很简单。首先将n除以2,然后将n除以2,然后检查n是否已更改。伪代码:

function is_even(n)
    n_original := n
    n := n >> 1        # n := n / 2
    n := n << 1        # n := n * 2
    if n = n_original then
        return true    # n is even
    else
        return false   # n is not even
    endif
end

使用n % 2实现bitwise and

function is_even(n)
    if n and 1 = 0 then
        return true
    else
        return false
    endif
end