力扣 题目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 };
View Code

 

 

 

posted @ 2022-04-17 18:54  无聊的阿库娅  阅读(30)  评论(0编辑  收藏  举报