leetcode-半ば数学-29。二つの整数-NOを割り

91.28パーセントをmycode

クラスのソリューション(オブジェクト):
     デフ(自己、配当、除数)分割:
         "" " タイプの配当:INT 
        :タイプ除数:INT 
        :RTYPE:int型
        """ 
        場合は除数== 0:
             返さないなし
         の場合((配当^除数)< 0):
            フラグ = -1
         
            フラグ = 1回の
        配当 = ABS(配当)であれば配当<0 配当
        除数 = ABS(除数)場合除数<0 除数
        MAX = 2147483647 
        MIN = -2147483648  
        のres =(配当// 除数)
         であればフラグ== -1 リターン MAX(MIN、フラグ* RES)
         返す分(MAX、RES)を

 

参考:

アイデア:実際には、除算を使用することはできませんが、私はまだ使用しています。

この質問は二つの整数の前提の下で実施し、乗算、除算を使用せずに必要な算術除算モジュロています。オーバーフローがMAX_INTを返した場合。この質問は、常にそれがゼロになるまでの配当により除数を減算直接考えています。このアプローチの反復回数、すなわち、そのような結果は、Nであり、アルゴリズムの複雑さはO(N)であり、結果の大きさです。ビット、すなわちアナログコンピュータ上で除算演算、動作を最適化するために使用することができます。数すなわちNUM = A0 * 2 ^ 0 + A1 * 2 ^ 1 + A2 * 2 ^ 2 + ... + * 2 ^ nは、バイナリ形式に変換されます。上記の式に基づいて配当が最大カーディナリティは、2を乗じた左一当量を得るよりも大きくなるまで、あなたは除数が左せることができます。結果は、2 ^ Kを増加しながら配当を持つたびに、ベースを減算します。配当金は、これまで除数以下になるまで、繰り返しの左の番号を削除し、再び左に続けます。このプロセスの反復の数が2のべき乗で終了するまでであるため、時間複雑度は、O(LOGN)です。注目すべきは、主に記号やオーバーフローの問題に対処。オーバーフローが長い長い使用して最初に計算することができるため、オーバーフローが変位する前に変位するかどうかを決定することができます。

#時間複雑:O(LOGN)
複雑スペース#:O(1)

 

def divide(dividend, divisor):
        """
        :type dividend: int
        :type divisor: int
        :rtype: int
        """
        positive = (dividend < 0) is (divisor < 0)
        dividend, divisor = abs(dividend), abs(divisor)
        res = 0
        while dividend >= divisor:
            temp, i = divisor, 1
            print(dividend,divisor,temp,i,res)
            while dividend >= temp:
                dividend -= temp
                res += i
                i <<= 1
                temp <<= 1
                print('..',dividend,divisor,temp,i,res)
        if not positive:
            res = -res
        return min(max(-2147483648, res), 2147483647)       

 下面这个更好理解些

class Solution(object):
    def divide(self, dividend, divisor):
        """
        :type dividend: int
        :type divisor: int
        :rtype: int
        """
        ispositive = True
        if dividend > 0 and divisor < 0:
            ispositive = False
        if dividend < 0 and divisor > 0:
            ispositive = False
        dividend = abs(dividend);divisor = abs(divisor)
        if dividend < divisor:
            return 0
        tmp = divisor
        ans = 1
        while dividend >= tmp:
            tmp <<= 1
            if tmp > dividend:
                break
            ans <<= 1
        tmp >>= 1
        nans = ans + self.divide(dividend - tmp,divisor)
        if ispositive:
            if ans > 2147483647:
                return 2147483647
            return nans
        if ans >= 2147483648:
            return -2147483648
        return 0 - nans
                

左移

 

おすすめ

転載: www.cnblogs.com/rosyYY/p/10983050.html