Divide Two Integers[leetcode]递归与循环
来源:互联网 发布:数据字典是用来定义 编辑:程序博客网 时间:2024/05/20 06:55
递归方法:
int divide(int dividend, int divisor) { bool isNeg = false; long long dvs = divisor,dvd = dividend; if (dividend < 0) { isNeg = !isNeg; dvd = -dvd; } if (divisor < 0) { isNeg = !isNeg; dvs = -dvs; } if(isNeg) return -divideCore(dvd, dvs, dvs, 1); else return divideCore(dvd, dvs, dvs, 1); } int divideCore(long long dvd, long long dvs, long long cur, long long mul) { if (dvd - dvs < 0) return 0; if (cur + cur < dvd) return divideCore (dvd, dvs, cur + cur, mul + mul); else return mul + divideCore (dvd - cur, dvs, dvs, 1); }
循环方法,利用divisor * x <= dividend, 从最高位31位开始猜x的值
int divide(int dividend, int divisor) { bool isNeg = false; long long dvs = divisor,dvd = dividend; if (dividend < 0) { isNeg = !isNeg; dvd = -dvd; } if (divisor < 0) { isNeg = !isNeg; dvs = -dvs; } if (dvd < dvs) return 0; if(isNeg) return -divideCore(dvd, dvs); else return divideCore(dvd, dvs); } int divideCore(long long dvd, long long dvs) { long long res = 0; int k = 31; long long curDivid = dvd; while (k>=0) { if (dvs <= curDivid >> k) { curDivid -= dvs << k; res += 1 << k; } k--; } return res; }
对于符号的检测,有更加优雅的方法:
int divide(int dividend, int divisor) {int count = 0;if (divisor == 0)return 0;unsigned int d1 = (dividend < 0 ? -dividend : dividend);unsigned int d2 = (divisor < 0 ? -divisor : divisor);for (int i = 31; i >= 0; i--){if ((d1 >> i) >= d2)//(dividend >= (divisor << i)) 溢出{d1 -= (d2 << i);count += (1 << i);}}if ((dividend >> 31) ^ (divisor >> 31))count = -count;return count;}
0 0
- Divide Two Integers[leetcode]递归与循环
- LeetCode: Divide Two Integers
- [LeetCode]Divide Two Integers
- LeetCode: Divide Two Integers
- [LeetCode] Divide Two Integers
- [Leetcode] Divide Two Integers
- LeetCode Divide Two Integers
- 【leetcode】Divide Two Integers
- [LeetCode]Divide Two Integers
- LeetCode-Divide Two Integers
- LeetCode: Divide Two Integers
- Divide Two Integers - leetcode
- Leetcode: Divide Two Integers
- LeetCode:Divide Two Integers
- leetcode Divide Two Integers
- LeetCode Divide Two Integers
- LeetCode | Divide Two Integers
- Leetcode: Divide Two Integers
- C#之常用工程技巧
- 雅虎军规(34条)
- 常用的数据操作函数
- 二进制兼容性
- install ruby 2.1.0 on ubuntu
- Divide Two Integers[leetcode]递归与循环
- HDU 5007 Post Robot(西安网络赛A题)
- python - easy_install的安装和使用
- 五大常用经典算法
- Apache Thrift - 可伸缩的跨语言服务开发框架
- ACM整理(七)——1006:zoj
- Java实现http协议的解析
- 函数指针
- hdu 5015 233 Matrix 2014 ACM/ICPC Asia Regional Xi'an Online 矩阵快速幂