0%

第二周:数值计算篇

2019年3月31日 下午5:53

参考文章:

LeetCode Divide Two Integers 两数相除 - Grandyang - 博客园

  1. 我一开觉得求绝对值、-ans这些都算是不符合规定的,后来发现其他人都是这么用的!
  2. 通过这道题有也发现:不用乘除法之后,速度大家都非常的快!

Divide Two Integers - LeetCode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//上一版本的:负数不能使用左移符号,ans没有忘了longlong了
class Solution {
public:
int divide(int dividend, int divisor) {
//处理int的边界
if (divisor == 0 || (dividend == INT_MIN && divisor == -1)) return INT_MAX;
if((dividend<divisor && dividend > 0) || (dividend>divisor && dividend<0) || (dividend<0 && divisor>0 && (dividend+divisor)>0) || (dividend>0 && divisor<0 && (dividend+divisor)<0)) return 0;
//使用long long 就不用处理步骤中的溢出问题
long long dividend2 = abs((long long)dividend), divisor2 = abs((long long)divisor), res = 0;
int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;

long long ans=0;

//处理全正的情况
if((dividend2 >=divisor2 && divisor2 > 0 )||(dividend2 <= divisor2 && divisor2 < 0 ))
{
long long temp_divisor = divisor2;
while(dividend2 >= temp_divisor){
//此时,i代表divisor左移次数
int i = 0;
divisor2 = temp_divisor;
while(dividend2 >= divisor2){
i++;
divisor2 <<= 1;
}
divisor2 >>= 1;
//此时,i代表2左移次数
i= i-2;

//更新结果
if(i == -1){
ans += 1;
}
else{
ans += 2<<i;
}

//更新dividend
dividend2 = dividend2 - divisor2;
}
}
return sign == 1 ? ans : -ans;
}
};