添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
风度翩翩的排球  ·  mysql ...·  2 年前    · 

这个问题是再力扣剑指offer上看到的,题目是:给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 ‘*’、除号 ‘/’ 以及求余符号 ‘%’
第一印象看到这道题标注的是简单题,但我感觉他不简单,看了讲解之后感觉也不是很难。解题开始:
首先一个思想就是不能用乘法,求余,咱们就用减法。
比如29/5=5…4
这个可以看成
29-5=24
24-5=19
19-5=14
14-5=9
9-5=4
所以结果可以是商5余4
大致的思想就有了

  int divide(int a, int b) {
while (a >= b) {
        a -= b;
        res++;
    return res;

这一部分代码也就解决了。
接下来考虑正负数的问题,都是负数的结果没有影响,一整一负对结果有影响,所以开始解决。

 int divide(int a, int b) {
    int sign = 1;
    if((a>0&&b<0) || (a<0&&b>0)){
    		sign = -1;
    //可优化成    int sign = (a > 0) ^ (b > 0) ? -1 : 1;
    return sign*res;

通过一个判断解决正负数问题。
然后就要考虑他的边界问题了,最大值和最小值。定义一个头文件
#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX - 1)
关于INT_MAX和INT_MIN(转载)
代码如下:

int divide(int a, int b) {
    if (a == INT_MIN && b == -1) return INT_MAX;
    int sign = (a > 0) ^ (b > 0) ? -1 : 1;
    if (a > 0) a = -a;
    if (b > 0) b = -b;
    unsigned int res = 0;
    while (a <= b) {
        a -= b;
        res++;
    return sign == 1 ? res : -res;
    //用三目运算符解决返回结果需要用到乘号的问题

时复杂度:O(n)
空间复杂度:O(1)

这样看来基本上是不是完成了,但是还没有,这样运行在力扣是运行会超时,进行优化,把上面的例子拿下来。
a=29, b=5
29-5=24
24-5=19
19-5=14
14-5=9
9-5=4
优化
a=29, b=5 k=1
29-(5+5) k=k+k=2
29-(10+10)=9 k=k+k=4
29-(20+20)<0
a =9, b=5 k=1
9-(5+5)<0
a=4 ,b=5

从一个一个的减变成两个再变成四个,到零减不了了就停止。关于k的值就是上一个k加上一个k等于新k,成倍增长就优化,降低了时间复杂度。

int divide(int a, int b) {
    if (a == INT_MIN && b == -1) return INT_MAX;
    int sign = (a > 0) ^ (b > 0) ? -1 : 1
    if (a > 0) a = -a;
    if (b > 0) b = -b;
    unsigned int res = 0;
    while (a <= b) {
        int value = b;
        // 如果不用 unsigned 的话,那么当 a = -2147483648, b = 1 的时候,k 会越界
        unsigned int k = 1;
        // 0xc0000000 是十进制 -2^30 的十六进制的表示
        // 判断 value >= 0xc0000000 的原因:保证 value + value 不会溢出
        // 可以这样判断的原因是:0xc0000000 是最小值 -2^31 的一半,
        // 而 a 的值不可能比 -2^31 还要小,所以 value 不可能比 0xc0000000 小
        while (value >= 0xc0000000 && a <= value + value) {
            k += k;
            value += value;
        a -= value;
        res += k;
    return sign == 1 ? res : -res;

时间复杂度:O(logn * logn)
空间复杂度:O(1)

这个问题是再力扣剑指offer上看到的,题目是:给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 ‘*’、除号 ‘/’ 以及求余符号 ‘%’第一印象看到这道题标注的是简单题,但我感觉他不简单,看了讲解之后感觉也不是很难。解题开始:首先一个思想就是不能用乘法,求余,咱们就用减法。比如29/5=5…4这个可以看成29-5=2424-5=1919-5=1414-5=99-5=4所以结果可以是商5余4大致的思想就有了 int divide(int a, int b)
2021-09-27 来自剑指offerⅡ的一道题,如何在不使用乘号、除、取余符的情况下实现整数除法操作。 首先想到的是被除数循环减除数,减到不能再减了,减的次数就是最终答案。这也是除法的本质,但是能不能快一点不用一个一个减呢?答案是可以的,我们可以通过位移被除数的操作来判断可减去除数的数量,代码如下。 class Solution { // a为被除数,b为除数 public int divide(int a, int b) { if (a == 0) public int divide(int a, int b) { if(a == Integer.MIN_VALUE && b == -1) { return Integer.MAX_VALUE; int sign = (a > 0) ^ (b > 0) ? -1 : 1;
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。 返回被除数 dividend 除以除数 divisor 得到的商。 题目来源:LeetCode29. 两数相除 链接:https://leetcode-cn.com/problems/divide-two-integers 倍增和二进制思想 举例:yx=k\frac{y}{x} = kxy​=k,将kkk转换为二进制如(11010) 再将二进制转换为十进制,即 y=24∗x+23∗.
int 的范围是[-2^31,2^31-1],也就是【-2147483648,2147483647】,如果-2147483648/-1结果会超出int 范围。 除法,乘法和mod都不能使用,那可以使用加减,移位。 只需保留商即可 解法一:每次自增除数 当然被除数减去除数也可以。 如 10/3,除数自增,10在【3+3+3,3+3+3+3】范围里面。 如果被除数取得很大,除数取得很小,那么会很慢。(二者同情况下) class Soluti 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符。 解题思路: 首先看十进制是如何做的: 5+7=12,三步走 第一步:相加各位的值,不算进位,得到2。 第二步:计算进位值,得到10. 如果这一步的进位 值为0,那么第一步得到的值就是最终结果。 第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12... a<<3相当于a*8; for(i;i>=0;i–){//从2的15次方开始除,如果结果比除数小那么继续下去直到结果比除数大于等于仔细理解 比如 输入 100和3 一开始100除以2的15次方是一个很小的数 不断除二除二除二… 直到32 100/32=3 很明显余数4也是大于3的此时若直接输出32显然不对(输出... 给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。 返回被除数 dividend 除以除数 divisor 得到的商。 示例 1: 输入: dividend = 10, divisor = 3 输出: 3 示例 2:输入: dividend = 7, divisor = -3输出: -2 【说... 扫描下方二维码,及时获取更多互联网求职面经、java、python、爬虫、大数据等技术,和海量资料分享: 公众菜鸟名企梦后台发送“csdn”即可免费领取【csdn】和【百度文库】下载服务; 公众菜鸟名企梦后台发送“资料”:...
我们知道:a/b 的话,可以描述为 a=q*b+r, 这里 r是一个 0<=r<b 的数 所以我们要找到最大的q来满足这个等式。 在寻找的时候我们可以每次乘二来探测,以降低线性查找的复杂度。 int div1(const int x,const int y) int a=x,b=y,c=0; int d=0; while(a>=b) 题目要求: 给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。 返回被除数 dividend 除以除数 divisor 得到的商。 整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2 示例 1: 输入: divid...
C++ 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。