leetcode29. 两数相除

目录

  • 题目来源
  • 解题方法
    • 递归
    • 位运算

题目来源

leetcode29. 两数相除_第1张图片

解题方法

递归

直接举例吧:11/3
因为11>3,所以解至少为1,接着我们让3翻倍为6,11>6,说明解至少为2,接着让6翻倍,11<12,所以我们应该考虑11-6的值与3再进行比较,即5>3,说明解至少为3,5<6我们该考虑5-3的值2,2<3,结束,答案为3
我们可以用long先存下,接着全部转为正数,最后带上符号

class Solution {
public:
    int divide(int dividend, int divisor) {
        if(dividend==0)
            return 0;
        if(divisor==1)
            return dividend;
        if(divisor==-1){
            if(dividend>INT_MIN)
                return -dividend;
            return INT_MAX;
        }
        long a=dividend;
        long b=divisor;
        int sign=1;
        if((a>0&&b<0) || (a<0&&b>0))
            sign=-1;
        a=a>0?a:-a;
        b=b>0?b:-b;
        cout << a << b << endl;
        long res=div(a,b);
        if(sign>0)
            return res>INT_MAX?INT_MAX:res;
        return -res;
    }
    long div(long a,long b){
        if(a

位运算

思路一样,速度会提高一倍

class Solution {
public:
    int divide(int dividend, int divisor) {
        if(dividend==0)
            return 0;
        if(divisor==1)
            return dividend;
        if(divisor==-1){
            if(dividend>INT_MIN)
                return -dividend;
            return INT_MAX;
        }
        long a=dividend;
        long b=divisor;
        int sign=1;
        if((a>0&&b<0) || (a<0&&b>0))
            sign=-1;
        a=a>0?a:-a;
        b=b>0?b:-b;
        cout << a << b << endl;
        long res=div(a,b);
        if(sign>0)
            return res>INT_MAX?INT_MAX:res;
        return -res;
    }
    long div(long a,long b){
        if(a

你可能感兴趣的:(leetcode刷题之路,算法,leetcode)