zoukankan      html  css  js  c++  java
  • Divide Two Integers

    Divide two integers without using multiplication, division and mod operator.

    思路:

    直接的想法是用减法代替,但是减法在极端情况下肯定会超时,最多可能会有2^31。

    然后考虑用移位,对除数左移位,直到将要大于被除数时为止,然后记录当前值,并更新被除数,如此循环。

    需要注意的是,因为int的范围是-2^32到2^32,所以如果最小的负数取整数就会越界,所以使用unsigned int或者long long代替。

    代码:

     1     int divide(int dividend, int divisor) {
     2         // IMPORTANT: Please reset any member data you declared, as
     3         // the same Solution instance will be reused for each test case.
     4         unsigned int big = abs(dividend), small = abs(divisor);
     5         bool isNegative = (dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0);
     6         unsigned int result = 0;
     7         while(big > small){
     8             unsigned int tmp = small;
     9             unsigned int tresult = 1;
    10             while(big > tmp){
    11                 tmp = tmp<<1;
    12                 tresult = tresult<<1;
    13             }
    14             if(big == tmp){
    15                 result += tresult;
    16                 break;
    17             }
    18             tmp = tmp>>1;
    19             tresult = tresult>>1;
    20             result += tresult;
    21             big = big-tmp;
    22         }
    23         if(big == small)
    24             result++;
    25         if(isNegative)
    26             return -result;
    27         return result;
    28     }

     第二遍

     1     long long divide2(long long dividend, long long divisor) {
     2         if((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0))
     3             return -divide2(abs(dividend), abs(divisor));
     4         else if(dividend < 0 && divisor < 0)
     5             return divide2(abs(dividend), abs(divisor));
     6         if(dividend == 0 || dividend < divisor)
     7             return 0;
     8         long long tmp = 1, num = divisor;
     9         while(dividend >= (num<<1)){
    10             tmp = tmp<<1;
    11             num = num<<1;
    12         }
    13         return tmp+divide2(dividend-num, divisor);
    14     }
    15     int divide(int dividend, int divisor) {
    16         return divide2((long long)dividend, (long long)divisor);
    17     }
  • 相关阅读:
    java rmi 入门实例
    flex“深拷贝”
    Cygwin 下部署Hadoop
    Hadoop学习原地
    Scribe+HDFS日志收集系统安装方法
    使用HDFS来进行线上应用的文件存储
    转:C++初始化成员列表
    转:为什么数据库选B-tree或B+tree而不是二叉树作为索引结构
    B树、B+树、B*树三者的对比详解
    转载:构造函数不能声明为虚函数,而构造函数可以。为什么?
  • 原文地址:https://www.cnblogs.com/waruzhi/p/3444595.html
Copyright © 2011-2022 走看看