• LeetCode OJ-- Divide Two Integers *


    https://oj.leetcode.com/problems/divide-two-integers/

    在不使用乘法、除法、求余的情况下计算除法。

    使用减法计算,看看减几次。

    刚开始寻思朴素的暴力做,然后超时了。

    于是开始增大每次的被减数

    但是溢出了。

    2的32次方=4294967296(无符号),带符号再除以2,负数比正数多一个,-2147483648~+2147483647

    所以int的范围就是 -2147483648~2147483648.

    于是当输入中有 -2147483648的时候,对于 abs()函数返回结果就溢出了,求得后的值还是 -2147483648.

    于是用 long long 来作为中间数据类型。并且不用abs()函数了。

    #include <iostream>
    #include <vector>
    #include <string>
    #include <algorithm>
    using namespace std;  
    
    class Solution {
    public:
        int divide(int dividend, int divisor) {
    
            long long dividend_l = dividend;
            long long divisor_l = divisor;
    
            bool positive = true;
            if(dividend_l>0&&divisor_l<0 || dividend_l<0 && divisor_l>0)
                positive = false;
    
            if(dividend_l<0)
                dividend_l = -dividend_l;
            if(divisor_l<0)
                divisor_l = -divisor_l;
    
            if(dividend ==0 || dividend_l< divisor_l)
                return 0;
            if(dividend == divisor)
                return 1;
    
            int ans = 0;
    
            while(dividend_l>=divisor_l)
            {
                ans += subDivide(dividend_l,divisor_l);
            }
    
            if(positive == false)
                ans = -ans;
    
            return ans;
        }
        int subDivide(long long &dividend,long long divisor)
        {
            int timesSum = 0;
            long times = 1;
            long long _divisor = divisor;
            while(_divisor>0 && dividend>=_divisor)
            {
                dividend = dividend - _divisor;
                _divisor += _divisor;
                timesSum += times;
                times += times; //means _divisor is how much copies of divisor
            }
            return timesSum;
        }
    };
    
    int main()
    { 
        class Solution mys;
        cout<<mys.divide(-1010369383,-2147483648);
    }
  • 相关阅读:
    java加密解密用法
    进程和线程
    office使用技巧
    apktool+dex2jar+jd_gui
    shell编程学习
    编程常犯的错误
    编程语言学习清单
    使用github托管自己的项目
    c# 异常 的 异想
    DNLA自学(一) UPnP设备发现
  • 原文地址:https://www.cnblogs.com/qingcheng/p/3817252.html
Copyright © 2020-2023  润新知