s**********r 发帖数: 8153 | |
m*******i 发帖数: 8711 | |
r**h 发帖数: 1288 | 3 不考虑负数的话
def multiply(a, b):
res, c = 0, a
while b>0:
if b & 1 == 1:
res += c
b >>= 1
c <<= 1
return res
考虑负数的话先取模再计算最后判断符号即可 |
a******1 发帖数: 2340 | 4 能用log么?
a * b = exp(log(a) + log(b)), 异号就加负号 |
b******7 发帖数: 92 | 5 就是leetcode pow(a,b)的变体
【在 s**********r 的大作中提到】 : 不是一个一个加哦。。。
|
z****e 发帖数: 54598 | 6 <<1 == *2
>>1 == /2
a*b = a*2*b/2 ... |
s**********r 发帖数: 8153 | 7 冥冥之中觉得和那个有点像,但怎么也搞不出来。
【在 b******7 的大作中提到】 : 就是leetcode pow(a,b)的变体
|
s**********r 发帖数: 8153 | 8 你解释的太好了。2行。全明白了。
【在 z****e 的大作中提到】 : <<1 == *2 : >>1 == /2 : a*b = a*2*b/2 ...
|
u*****o 发帖数: 1224 | 9 IF考虑到是b最后除到1的时候,但再下一步呢?除到0时RESULT没有ASSIGN VALUE啊
而且为啥要用C呢?直接用a不行吗?
【在 r**h 的大作中提到】 : 不考虑负数的话 : def multiply(a, b): : res, c = 0, a : while b>0: : if b & 1 == 1: : res += c : b >>= 1 : c <<= 1 : return res : 考虑负数的话先取模再计算最后判断符号即可
|
z****e 发帖数: 54598 | 10 你要额外判断一个%2
a%2 == a&1
【在 s**********r 的大作中提到】 : 你解释的太好了。2行。全明白了。
|
|
|
s**********r 发帖数: 8153 | 11 这里边 b 不能是int了吧?b是double? float?
b不能被2整除咋整。
【在 z****e 的大作中提到】 : <<1 == *2 : >>1 == /2 : a*b = a*2*b/2 ...
|
z****e 发帖数: 54598 | 12 见楼上
如果是float的话,那就只能转成string操作了
估计不会面这种题,转成string之后就是实现题
要先做string大数加法,然后再在这个基础之上做string大数乘法
同时还要实现99乘法口诀表
【在 s**********r 的大作中提到】 : 这里边 b 不能是int了吧?b是double? float? : b不能被2整除咋整。
|
s**********r 发帖数: 8153 | 13 嗯嗯,好的,谢谢咯!
【在 z****e 的大作中提到】 : 见楼上 : 如果是float的话,那就只能转成string操作了 : 估计不会面这种题,转成string之后就是实现题 : 要先做string大数加法,然后再在这个基础之上做string大数乘法 : 同时还要实现99乘法口诀表
|
u*****o 发帖数: 1224 | 14 这个判断是每个LOOP都要的,还是只在最后一步b除到1的时候呢?
比如14*7
如果不每个LOOP考虑一下的话根本加不到啊
14×7 下一步是 28×3 下一步是 56×1.。。每一步都丢了一个a, 如果到了b=1的时候
再考虑b&1, 是不是加不到原数了呢?
【在 z****e 的大作中提到】 : 你要额外判断一个%2 : a%2 == a&1
|
z****e 发帖数: 54598 | 15 我刚出去邮局拿东西时候想了下
我觉得还是直接放在loop里做判断好了
while(b>0){
if(b==1)...
else...
}
这样就可以抛掉&1运算
如果想用上这个,就先算一下
然后对自身做一个一层递归就好了
【在 u*****o 的大作中提到】 : 这个判断是每个LOOP都要的,还是只在最后一步b除到1的时候呢? : 比如14*7 : 如果不每个LOOP考虑一下的话根本加不到啊 : 14×7 下一步是 28×3 下一步是 56×1.。。每一步都丢了一个a, 如果到了b=1的时候 : 再考虑b&1, 是不是加不到原数了呢?
|
w**********o 发帖数: 140 | 16
a > b
【在 r**h 的大作中提到】 : 不考虑负数的话 : def multiply(a, b): : res, c = 0, a : while b>0: : if b & 1 == 1: : res += c : b >>= 1 : c <<= 1 : return res : 考虑负数的话先取模再计算最后判断符号即可
|
j**7 发帖数: 143 | 17 public static int multiple(int a, int b) {
int product = 0;
while (b > 0) {
if ((b & 1) == 1) {
product += a;
}
a = a << 1;
b = b >> 1;
}
return product;
} |
B*****g 发帖数: 34098 | 18 这个我都看懂了,赞一个
【在 z****e 的大作中提到】 : <<1 == *2 : >>1 == /2 : a*b = a*2*b/2 ...
|
k*****o 发帖数: 1972 | 19 nice,
小学算术步骤
【在 j**7 的大作中提到】 : public static int multiple(int a, int b) { : int product = 0; : while (b > 0) { : if ((b & 1) == 1) { : product += a; : } : a = a << 1; : b = b >> 1; : } : return product;
|