【Leetcode】 - Divide Two Integers 位运算实现整数除法
2014-11-15 21:05
375 查看
实现两个整数的除法,不许用乘法、除法和求模。题目被贴上了BinarySearch,但我没理解为什么会和BinarySearch有关系。我想的方法也和BS一点关系都没有。
很早以前我就猜想,整数的乘法是不是总是可以用移位和加法来实现?当然可以了,任何整数都可以写成2n或2n+1的形式,移位就是那个乘以2,加法就是最后的+1了嘛。复杂度是O(1),因为整数的移位最多32次,因此在循环中移位的次数也极其有限。
例如123/5:
5 123
<<1
<<1
<<1
<<1
5*16 = 80
5 123-80=43
<<1
<<1
<<1
5*8 = 40
5 43-40=3
5<3, thus result = 16+8 = 24
(if dividend == 125, finally we have:
5==5, thus result = 16+8+1 = 25;)
于是:
Leetcode上测试时间为36ms。
这里玩了一个小trick,用long long而不是int来存变量了,主要是防止被除数太大时除数移位会溢出变成负数。当然去掉long long也不难啦,加上溢出的判断就好了。只不过,这里的溢出判断和函数atoi是有所不同的,atoi中的result每次乘以10再加上0-9,而这边是乘以2。以上。
很早以前我就猜想,整数的乘法是不是总是可以用移位和加法来实现?当然可以了,任何整数都可以写成2n或2n+1的形式,移位就是那个乘以2,加法就是最后的+1了嘛。复杂度是O(1),因为整数的移位最多32次,因此在循环中移位的次数也极其有限。
例如123/5:
5 123
<<1
<<1
<<1
<<1
5*16 = 80
5 123-80=43
<<1
<<1
<<1
5*8 = 40
5 43-40=3
5<3, thus result = 16+8 = 24
(if dividend == 125, finally we have:
5==5, thus result = 16+8+1 = 25;)
于是:
int divide(long long a, long long b) { if(b==0) return a>=0?0x7fffffff:0x80000000; if(a==0) return 0; if(b==1) return a; int sgn = (a^b) & 0x80000000; //0 -> +, 0x80000000 -> - if(a<0) a=-a; if(b<0) b=-b; //a,b>0 if(a<b) return 0; int res = 0, _b = b, twon; while(a>b) { twon = 1; while(a>b) { b<<=1; twon<<=1; } b>>=1; twon>>=1; a -= b; b = _b; res += twon; } if(a==b) res++; if(sgn) return -res; else return res; }
Leetcode上测试时间为36ms。
这里玩了一个小trick,用long long而不是int来存变量了,主要是防止被除数太大时除数移位会溢出变成负数。当然去掉long long也不难啦,加上溢出的判断就好了。只不过,这里的溢出判断和函数atoi是有所不同的,atoi中的result每次乘以10再加上0-9,而这边是乘以2。以上。
相关文章推荐
- 【LeetCode-面试算法经典-Java实现】【029-Divide Two Integers(两个整数相除)】
- LeetCode 29. Divide Two Integers(整数除法)
- leetCode 29.Divide Two Integers (两整数相除) 解题思路和方法
- (LeetCode) Divide Two Integers (Java)思路讲解及实现
- Leetcode刷题记——29. Divide Two Integers(整数相除Divide two integers without using multiplication, division)
- LeetCode 29. Divide Two Integers(除法)
- [LeetCode] Sum of Two Integers(用位运算实现加法)
- Divide Two Integers:实现除法
- LeetCode 29 Divide Two Integers 除法的原理
- LeetCode 29 Divide Two Integers(两个整数相除)(*)
- LeetCode Divide Two Integers 不使用除号取模乘号实现两数相除
- Leetcode 371. Sum of Two Integers 位运算实现加法 解题报告
- [LeetCode-29] Divide Two Integers(两个整数相除,不能使用乘除取余算术符)
- [LeetCode] 数学计算模拟类问题:加法,除法和幂,注意越界问题。题 剑指Offer,Pow(x, n) ,Divide Two Integers
- LeetCode 29 Divide Two Integers (不使用乘法,除法,求模计算两个数的除法)
- 029-Divide Two Integers-不用乘除取模来实现整型除法
- leetcode 29. Divide Two Integers 做除法
- LeetCode 29 Divide Two Integers 除法的原理
- [leetcode] Sum of Two Integers--用位运算实现加法运算
- LeetCode-Divide Two Integers-快速除法