给定两个整数,被除数 dividend
和除数 divisor
。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend
除以除数 divisor
得到的商。
示例 1:
输入: dividend = 10, divisor = 3 输出: 3
示例 2:
输入: dividend = 7, divisor = -3 输出: -2
说明:
- 被除数和除数均为 32 位有符号整数。
- 除数不为 0。
- 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31, 2^31 − 1]。本题中,如果除法结果溢出,则返回 2^31 − 1
#define INT_TO_UNIT32_MAX 0x80000000 int divide(int dividend, int divisor){ assert(divisor!=0); if(dividend==0)return 0; if(dividend==INT_MIN&&divisor==-1)return INT_MAX; int symbol=(dividend^divisor)<0?0:1; unsigned int dividend_temp=(dividend==INT_MIN)?INT_TO_UNIT32_MAX:abs(dividend); unsigned int divisor_temp=(divisor==INT_MIN)?INT_TO_UNIT32_MAX:abs(divisor); unsigned int ret=0; for(int i=31;i>=0;i--) { if((dividend_temp>>i)>=divisor_temp) { ret+=((unsigned int)1)<<i; dividend_temp-=divisor_temp<<i; } } if(ret==INT_TO_UNIT32_MAX) { return INT_MIN; } else { return symbol==1?(int)ret:-(int)ret; } }
执行用时 : 0 ms, 在Divide Two Integers的C提交中击败了100.00% 的用户
内存消耗 : 6.9 MB, 在Divide Two Integers的C提交中击败了71.83% 的用户
1.我自己是想使用数组保存divisor divisor *2 divisor *2*2 然后去和dividend匹配,用另外一个数组保存当前位置与divisor 相差的倍数,用匹配到的所有结果相加即为最后的值。
2.查看评论发现别人的写法非常简洁,在此转载一下