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     }
  • 相关阅读:
    python出现local variable 'f' referenced before assiginment""
    使用Python修改ifcfg-eth0文件
    在linux中运行py文件时,及时知道错误信息
    分词结果准确率、召回率计算-python
    oozie工作流
    combiner hadoop
    Python常用模块--base64
    Python常用模块--datetime
    树莓派(Raspbian系统)中使用pyinstaller封装Python代码为可执行程序
    LeetCode刷题笔记--Python--28. 实现strStr()
  • 原文地址:https://www.cnblogs.com/waruzhi/p/3444595.html
Copyright © 2011-2022 走看看