如何设计算法以通过加法来模拟乘法。输入两个整数。它们可能是零,正面或负面。
答案 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