LeetCode 29题:两数相除

这篇具有很好参考价值的文章主要介绍了LeetCode 29题:两数相除。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目

给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。

整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2 。

返回被除数 dividend 除以除数 divisor 得到的  。

注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−231,  231 − 1] 。本题中,如果商 严格大于 231 − 1 ,则返回 231 − 1 ;如果商 严格小于 -231 ,则返回 -231 。

示例 1:

输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = 3.33333.. ,向零截断后得到 3 。

示例 2:

输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = -2.33333.. ,向零截断后得到 -2 。

提示:

  • -231 <= dividend, divisor <= 231 - 1
  • divisor != 0

思路 

这道题我是将除法转化为减法,如:

LeetCode 29题:两数相除,LeetCode练习题,leetcode,算法,c语言

将被除数分为 n 个除数。

这样要求我们先对结果的正负进行判断,然后对除数与被除数取绝对值进行减法。

为了加快速度,令 d= 除数 b ,将 d 每次与被除数 a/2 比较后乘以2,再进行比较,用 c 代表此时的d = c * b文章来源地址https://www.toymoban.com/news/detail-637824.html

代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int divide(int dividend, int divisor);

int main()
{
    int a = 2147483647;
    int b = 1;
    int c = divide(a, b);
    printf("%d", c);
}

int divide(int dividend, int divisor)
{
    int res = 0;
    int sign = 1;
    if ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0))
        sign = -1;
    if (divisor == INT_MIN)
    {
        if (dividend == INT_MIN)
            return 1;
        else
            return 0;
    }
    if (dividend == INT_MIN)
    {
        if (divisor == 1)
            return INT_MIN;
        else if (divisor == -1)
            return INT_MAX;
        res++;
        dividend = dividend + fabs(divisor);
    }
    int a = fabs(dividend);
    int b = fabs(divisor);
    while (a >= b)
    {
        int c = 1;
        int d = b;
        while (a/2 >= d)// a/2 是为了防止 2*d >INT_MAX 同时 a >= 2*d,为后面做准备
        {
            d = 2 * d;
            c = 2 * c;
        }
        a = a - d;//c 指 d 代表 c 个 b
        res = res + c;
    }
    if (sign == -1)
        res = -res;
    return res;
}

到了这里,关于LeetCode 29题:两数相除的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】算法的时间复杂度和空间复杂度 (上)(附leetcode练习题)

    ☃️个人主页:fighting小泽 🌸作者简介:目前正在学习C语言和数据结构 🌼博客专栏:数据结构 🏵️欢迎关注:评论👊🏻点赞👍🏻留言💪🏻 如何衡量一个算法的好坏呢?比如对于以下斐波那契数列: 斐波那契数列的递归实现方式非常简洁,但简洁一定好吗?那该如何

    2023年04月22日
    浏览(60)
  • 力扣(LeetCode)数据结构练习题(2)

    今天又写了两道关于链表的练习题,来给大家分享一下。巩固一下上一篇学到的链表知识,题目可以然我们更清楚的认识链表。 目录 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表 给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中

    2024年02月21日
    浏览(52)
  • 【LeetCode】练习习题集【4月 - 7 月】

    1.重复数 题目: 代码: 9.回文数 题目: 思路: 如果是负数一定不是回文数 直接返回false 如果是正数,则将其倒序数值计算出来,然后比较和原数值是否相等 如果是回文数相等返回true 不相等返回false 代码: 13. 罗马数字转整数 (https://leetcode.cn/problems/roman-to-integer/) 题目:

    2024年02月13日
    浏览(41)
  • 【数据结构】顺序表详解(附leetcode练习题)

    ☃️个人主页:fighting小泽 🌸作者简介:目前正在学习C语言和数据结构 🌼博客专栏:数据结构 🏵️欢迎关注:评论👊🏻点赞👍🏻留言💪🏻 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺

    2023年04月27日
    浏览(47)
  • 模拟实现atoi函数(将数字字符串转换为整型)附加leetcode练习题

    各位朋友们,大家好啊!今天我为大家分享的知识是如何模拟实现atoi函数。相信大家如果能够理解这个知识,对大家以后的刷题是有帮助的。 我们要想实现某个函数,我们肯定要先知道这个函数的作用是什么,然后我们再根据它的作用来自己实现。我们先来看看stoi函数在库

    2023年04月19日
    浏览(57)
  • 练习题----顺序栈算法

    ​输入一个包括 \\\'(\\\' 和 \\\')\\\' 的字符串string ,判断字符串是否有效。要求设计算法实现检查字符串是否有效,有效的字符串需满足以下条件: A. 左括号必须用相同类型的右括号闭合。 B. 左括号必须以正确的顺序闭合。 C. 每个右括号都有一个对应的相同类型的左括号。 ​该题需

    2024年04月26日
    浏览(42)
  • <算法学习>动态规划练习题

    本篇文章为初学动态规划时的练习题。参考优质博客学习后根据伪代码描述完成代码。记录一下用于以后复习。 给定一个有n行数字组成的数字三角形. 试设计一个算法, 计算出从三角形的顶至底的一条路径, 使该路径经过的数字和最大. 算法设计: 对于给定的n行数字组成的三角

    2024年01月17日
    浏览(47)
  • Matlab:遗传算法,模拟退火算法练习题

    1、遗传算法 (1) 遗传算法 是一种基于自然选择原理和自然遗传机 制的搜索(寻优)算法,它是模拟自然界中的生命进化机制,在人工系统中实现特定目 标的优化。遗传算法的实质是通过群体搜索技术,根据适者生存的原则逐代进化,最终 得到最优解或准最优解。它必须

    2024年01月21日
    浏览(46)
  • 拓扑排序 (算法思想+图解+模板+练习题)

    有向无环图一定是拓扑序列,有向有环图一定不是拓扑序列。 无向图没有拓扑序列。 首先我们先来解释一下什么是有向无环图: 有向就是我们两个结点之间的边是有方向的,无环的意思就是整个序列中没有几个结点通过边形成一个圆环。 下图就是一个有向无环图,它也一定

    2024年02月03日
    浏览(64)
  • 【算法设计与分析】动态规划-练习题

    输入一个整数数组 S[n] ,计算其最长递增子序列的长度,及其最长递增子序列。 定义 k ( 1 ≤ k ≤ n ) k (1 ≤ k ≤ n) k ( 1 ≤ k ≤ n ) ,L[k]表示以 S[k] 结尾的递增子序列的最大长度。子问题即为 L[k]。 对于每一个k,我们都遍历前面0~k-1的所有的数,找出最大的L[i],且 S [ k ] L [

    2024年02月03日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包