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

    Question

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

    If it is overflow, return MAX_INT.

    解题思路

    当拿到这道题的时候,就在想为啥Accept率只有16%,可能坑有点多,没想到是真的。

    下面要讲一下解题过程,首先题目说了不能用*,/, mod,所以我们可以用+,-,>>,<<。

    第一反应,除法的结果就是减去减数的个数,好直接开写,结果发现超时了,说明不能直接用减法,那么我们考虑用上移位操作。 那么怎么用呢?

    举个例子: 15 / (3 << 1) = 15 / (3 * 2), 15 < (3 * 2 * 2 * 2) 说明结果至少是大于等于4的,15 - (322) = 3, 3 / 3 = 1, 所以最终的结果是等于4 + 1 = 5.

    代码实现细节,先将除数左移到一个比被减数大的数,然后在依次减少除数,直到被除数比除数小为止。

    还有一个注意事项就是溢出的时候输出MAX_INT,为了避免这个,一来我们就把被除数和除数转为了long类型,然后最后输出的时候再判断一下即可。

    代码实现

    #include <iostream>
    
    using namespace std;
    
    class Solution {
    public:
        int divide(int dividend, int divisor) {
            long sign = 1;
            if(dividend<0) sign = -sign;
            if(divisor<0) sign = -sign;
            long c = 1;
            long tmp = abs((long)dividend);
            long tmp2 = abs((long)divisor);
            while(tmp>tmp2){
                tmp2 = tmp2<<1;
                c=c<<1;
            }
            long result =0;
            while(tmp>=abs((long) divisor)){
                while(tmp>=tmp2){
                    tmp = tmp - tmp2;
                    result += c;
                }
                tmp2 = tmp2>>1;
                c=c>>1;
            }
            return int(sign*result > INT_MAX ? INT_MAX : sign*result);
        }
    };
    
    
    int main() {
        Solution* solution = new Solution();
        cout << solution->divide(1, -1) << endl;
        return 0;
    }
    
  • 相关阅读:
    select详解
    java Map及Map.Entry详解
    Java 基本类型
    java 获取String出现最多次数的字段
    java 居民身份证的校验
    java 删除文件
    Java 导出excel进行换行
    获取文件及其文件路径
    List<Map<String,Object>> 中文排序
    Java ----单个list 删除元素
  • 原文地址:https://www.cnblogs.com/zhonghuasong/p/6499030.html
Copyright © 2011-2022 走看看