码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode: Divide Two Integers 解题报告

时间:2014-10-24 22:02:06      阅读:279      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   使用   java   

Divide Two Integers

bubuko.com,布布扣
Divide two integers without using multiplication, division and mod operator.

SOLUTION 1
1. 基本思想是不断地减掉除数,直到为0为止。但是这样会太慢。

2. 我们可以使用2分法来加速这个过程。不断对除数*2,直到它比被除数还大为止。加倍的同时,也记录下cnt,将被除数减掉加倍后的值,并且结果+cnt。

因为是2倍地加大,所以速度会很快,指数级的速度。

3. 另外要注意的是:最小值的越界问题。对最小的正数取abs,得到的还是它。。。 因为最小的正数的绝对值大于最大的正数(INT)

所以,我们使用Long来接住这个集合就可以了。

bubuko.com,布布扣
 1 public class Solution {
 2     public int divide(int dividend, int divisor) {
 3         long a = Math.abs((long)dividend);
 4         
 5         // ref : http://blog.csdn.net/kenden23/article/details/16986763
 6         // Note: 在这里必须先取long再abs,否则int的最小值abs后也是原值
 7         long b = Math.abs((long)divisor);
 8         
 9         int ret = 0;
10         // 这里必须是= 因为相等时也可以减
11         while (a >= b) {
12             // 判断条件是 >=
13             for (long deduce = b, cnt = 1; a >= deduce; deduce <<= 1, cnt <<= 1) {
14                 a -= deduce;
15                 ret += cnt;
16             }
17         }
18         
19         // 获取符号位。根据除数跟被除数的关系来定
20         return (dividend > 0) ^ (divisor > 0) ? -ret: ret;
21     }
22 }
View Code

GitHub Code:

divide.java

 

Ref: http://blog.csdn.net/fightforyourdream/article/details/16899675

LeetCode: Divide Two Integers 解题报告

标签:style   blog   http   color   io   os   ar   使用   java   

原文地址:http://www.cnblogs.com/yuzhangcmu/p/4049170.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!