力扣 题目29-- 两数相除
题目
题解
说实话这题如果没有边界 直接做的话肯定不难 但是就是难在最大和最小了
首先 我们是不是要根据两个数的符号考虑到几种情况再分呢?其实是不用的
我们可以转换某一种情况 然后只要最后返回的时候知道是正是负即可
那么最方便还是同符号吧 那么考虑一下都是正数?
但是 我们要知道INT_MIN 是不能直接- 到正数的 因为INT_MAX 没有那么大
那么只能到负数了 知道这一点我们再继续
先从普通的数开始吧 写一个int temp = divisor ;sign = 1;然后循环 这个temp用来 做divisor 的倍乘 sign用来记录循环的次数 然后与adividend 比较大小 但是乘法不能用 所以只能用循环和加法了
再找到对应的数后 让dividend减去这个这个数 (即比dividend最后小的那一次)
然后继续循环到dividend 为0即可 最后sign的加和就是答案 别忘记之前的符号
还有就是 界限的特殊需要考虑
代码
1 class Solution { 2 public: 3 int divide(int dividend, int divisor) { 4 //特殊情况 具体分析 5 if (dividend == 0) { 6 return 0; 7 } 8 if ((dividend == INT_MAX && divisor == -1) || (dividend == INT_MIN && divisor == -1)) { 9 return INT_MAX; 10 } 11 if (dividend == INT_MIN && divisor == 1) { 12 return INT_MIN; 13 } 14 int num = 0; 15 int adividend = dividend; 16 int adivisor = divisor; 17 //转换为负 18 if (dividend > 0) { 19 adividend = -dividend; 20 } 21 if (divisor > 0) { 22 adivisor = -divisor; 23 } 24 int temp = adivisor; 25 int sign = 0; 26 int res = 0; 27 //开始循环 28 while (adividend<= adivisor) { 29 //每次开局应该为1 因为判断成功就一定会有1 30 sign = 1; 31 temp = adivisor; 32 //当倍数比adividend大时执行(因为是负数所以有点难理解) 33 while (temp >= adividend - temp) 34 { 35 temp += temp; 36 sign += sign; 37 } 38 //减一下 39 adividend -= temp; 40 //加和 41 res = res + sign; 42 } 43 num = res; 44 //如果符合不一样则返回-num 45 if ((dividend < 0 && divisor>0) || (dividend > 0 && divisor < 0)) { 46 return -num; 47 } 48 return num; 49 } 50 };