• 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     }
  • 相关阅读:
    dnn5.5.1的配置
    The Auto option has been disabled as the DotNetNuke Application cannot connect to a valid SQL Server database
    DNN常用的几种页面跳转(EditUrl和Globals.NavigateURL)
    动态生成ASP.NET按钮时要注意的一个问题
    Visual C#实现Windows信使服务
    浏览器滚动条的参数总结
    AJAX实现无刷新三联动下拉框
    c#.net常用的小函数和方法集
    利用OWC生成统计图表(代码+注释)
    ASP.NET之精通弹出窗口
  • 原文地址:https://www.cnblogs.com/waruzhi/p/3444595.html
Copyright © 2020-2023  润新知