leetcode [29] Divide Two Integers
[29] Divide Two Integers
https://leetcode.com/problems/divide-two-integers/description/
Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator.
Return the quotient after dividing dividend by divisor.
The integer division should truncate toward zero.
Example 1:
Input: dividend = 10, divisor = 3
Output: 3
Example 2:
Input: dividend = 7, divisor = -3
Output: -2
Note:
Both dividend and divisor will be 32-bit signed integers.
The divisor will never be 0.
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−2^31, 2^31 − 1]. For the purpose of this problem, assume that your function returns 2^31 − 1 when the division result overflows.
题目大意
给两个整数,返回被除数除以除数的结果,不允许使用乘法,除法和取余操作。
解法
思想是想让除数无限接近于被除数。首先确定结果的符号,如果被除数和除数同号,说明结果是正数,反之,就是负数,可以使用异或进行判断。
然后取被除数和除数的绝对值,判断被除数含有多少个除数。
例如给10和3,判断10>3?结果是大于3,将3>>1,并将1>>1,再比较10>6?将6>>1,并将2>>1,再判断10>12?否
可以判断10中含有2个3,再用10-2*3=4含有多少个3
C++:
int divide(int dividend, int divisor) {
if(dividend==INT_MIN && divisor==-1) return INT_MAX;
long dvd=labs(dividend),dvs=labs(divisor),ans=0;
int sign=dividend>0^divisor>0?-1:1;
while(dvd>=dvs){
long tmp=dvs,m=1;
while(tmp<<1<=dvd){
tmp<<=1;
m<<=1;
}
dvd-=tmp;
ans+=m;
}
return sign*ans;
}
Python:
class Solution(object):
def divide(self, dividend, divisor):
"""
:type dividend: int
:type divisor: int
:rtype: int
"""
positive=(dividend>0)is(divisor>0)
dvd,dvs=abs(dividend),abs(divisor)
res=0
while dvd>=dvs:
tmp,i=dvs,1
while (tmp<<1)<dvd:
tmp<<=1
i<<=1
dvd-=tmp
res+=i
if not positive:
res=-res
return max(-2**31,min(res,2**31-1))

浙公网安备 33010602011771号