• Divide Two Integers -- LeetCode


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

    If it is overflow, return MAX_INT.

    思路:

    采用位运算。我们先将两个数都看作是正数。

    我们将除数左移一位就是将它扩大2倍,左移两位就是扩大4倍,一直左移到再左移一次就会大于被除数为止。

    为了记录扩大了多少倍,用一个变量multi = 1也跟着一起左移。

    然后用被除数减去扩大后的除数,若结果仍然大于等于原来的除数,则再重复刚才的过程。每次循环中结果都加上multi的值。

    这个题中有两种情况可能溢出:

    1. 除数是0.

    2. 被除数是INT_MIN, 除数是-1。因为INT_MIN(-2147483648, -2^31)的绝对值比INT_MAX(2147483647, 2^31-1)要大一。

     1 class Solution {
     2 public:
     3     int divide(int dividend, int divisor) {
     4         if (!divisor || (dividend == INT_MIN && divisor == -1))
     5             return INT_MAX;
     6         int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;
     7         long long dvd = (long long)labs(dividend);
     8         long long dvs = (long long)labs(divisor);
     9         int res = 0;
    10         while (dvd >= dvs)
    11         {
    12             long long tem = dvs, mul = 1;
    13             while (dvd >= (tem << 1))
    14             {
    15                 tem <<= 1;
    16                 mul <<= 1;
    17             }
    18             dvd -= tem;
    19             res += mul;
    20         }
    21         return sign * res;
    22     }
    23 };
  • 相关阅读:
    一个优秀的博主 有助于前端进阶
    JS异步的理解以及promise
    node-sass出错
    vuecli脚手架搭建
    GitHub上传项目方法
    ES6转ES5
    webpack---安装与卸载
    CSS之BFC详解
    Vue.js学习 --环境搭建
    python is和==的区别
  • 原文地址:https://www.cnblogs.com/fenshen371/p/5170502.html
Copyright © 2020-2023  润新知