不用除号乘号完成除法(C++)

2023-11-03

这个问题是再力扣剑指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)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不用除号乘号完成除法(C++) 的相关文章

  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 将 log4net 与 Autofac 结合使用

    我正在尝试将 log4net 与 Autofac 一起使用 我粘贴了这段代码http autofac readthedocs org en latest examples log4net html http autofac readthed
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当

随机推荐

  • 常用Dos命令

    1 dos命令 color all 修改背景字体颜色 cls 清屏 dir 查看当前目录有哪些文件 a 查看隐藏文件 a d 只查看目录不显示文档 r 只读文件 A 准备存档的文件 在内存中写了但是没网硬盘里面写 S 系统文件 c 显示文内
  • Caffe 工程的一些编译错误以及解决方案

    CAFFE深度学习交流群 532629018 整理一下最近遇到caffe工程的一些编译错误以及解决方法 1 cuDNN cuDNN当前最新版本是v5 近两三年的一些caffe工程 使用的版本不尽相同 其中以v2 v3版本的最为常见 所以使用
  • UCenter安装时提示mysql_connect()不支持

    问题描述 安装时 提示mysql connect 不支持 请检查 mysql 模块是否正确加载 如下图 分析原因 查看php官方帮助文档得知 mysql connect是php4有php5中的函数 在php5 5 0已标记为废弃 在php7
  • python-numpy一些方法总结

    1 multiply 例子 x1 1 2 3 x2 4 5 6 print multiply x1 x2 输出 4 10 18 multiply函数得到的结果是对应位置上面的元素进行相乘 2 std 标准方差 var 方差 例子 b 1 3
  • C++继承时派生类与基类有同名函数时如何分别引用

    一 普通函数同名 当某个函数func 在基类和派生类中都有定义时 派生类中的函数func 将修改从基类继承来的函数func 如果非要从派生类中访问基类的函数func 有两种方法 定义基类指针 让基类指针指向派生类对象 则调用的是基类func
  • ns2报错

    若报以下错误 finish couldn t execute nam no such file or directory 最简单的解决方法是在命令行中到你的ns安装目录下 进入nam目录 输入 sudo make install
  • k8s部署SpringBoot项目

    一 前言 本文将介绍如何通过CICD将SpringBoot框架的Web项目发布到k8s集群中 文章中有使用到eureka的注册 如果对如何在k8s集群中部署eureka 那么可以参考本人的 k8s部署eureka集群 文章 如果只是为了测试
  • java常见笔试题目

    1 下列那一行代码编译后不会出现警告或错误 1 char c a 2 byte b 257 3 boolean b null 4 int i 10 5 float f 1 3 2 下面这段代码编译时会发生什么情况 public class
  • 基于光栅波导结构的 R AR&MR 系统的 建模

    增强现实和混合现实 AR MR 作为全新的头戴式显示概念 作为 5G 时代的一个核心应用 具有巨大的市场需求和潜力 其中一种典型的 AR MR 设备是基于光栅波导结构 而正是因为 光学光栅这种微纳元件的使用 我们不能简单地使用基于几何光学的
  • 无线充电技术

    在過去的百年之中 作為電器與插座之間的連線 電線已經成了一種習慣且不可或缺的存在 儘管無線充電技術在實驗室中已存在多年 卻始終因為需求不高而無法量產 不過 這一切將在不久的未來改變 一場以無線充電為主角的科技革命 正以近年來被廣泛使用的各種
  • 很漂亮的按钮css样式(没有用到图片,可直接拷贝代码使用)

    对于程序员 有时候也需要对页面风格做些改动 整体的页面风格还是美工的工作 按钮其实是程序员很常用的 如果美工没有设计好 那就自己设计吧 在网上发现有乐于奉献的人共享了代码 效果很好 而且没有使用到图片 这个很重要 如果你使用别人的css 里
  • 智能家居解决方案及企划书

    一 背景 随着科技的不断发展 智能家居已经成为了一种趋势 越来越多的人开始追求智能化 便捷化 舒适化的生活方式 智能家居市场也因此迅速崛起 本企划书旨在为智能家居市场提供一套完整的解决方案 帮助企业在竞争激烈的市场中占据一席之地 二 市场分
  • verilog设计——SPI

    spi master timescale 1ns 1ps module spi master parameter CLK FREQUENCE 50 000 000 system clk frequence SPI FREQUENCE 5 0
  • 【简单代码】Python 海龟画图简单实现任何图象落在窗口中心处(五角星为例)

    话不多说直接上代码 import turtle import math def go centre zuobiao 此函数实现初始笔点左上移 因为本代码五角星是顺时针画 即在右下角 hang list lie list for hang l
  • Win7/Win10移动用户文件夹(C:\Users)移到非系统盘(如D:)

    Windows的用户文件夹默认所在位置是系统盘 通常是C盘 下的 Users 目录之内 该文件夹中保存着所有的用户个人数据 比如你保存在 桌面 上的文件 实际上是保存在C Users 你的用户名 Desktop 目录之中 再比如你保存在 我
  • 基于标志点特征高精提取与匹配方法,进行双目、结构光、RGBD相机、单目相机多视拼接

    1 工作原理 人工张贴标志点 变换位置拍照 相邻照片的公共视野内有相同的标志点群 匹配两张照片对应标志点对 通过三对以上标志点对 实现两张照片间的坐标变换求解 2 标志点特征 圆形 分类 编码 粘贴于被测物体表面 可利用编码信息辅助特征匹配
  • RTSP/Onvif协议安防平台EasyNVR调用接口录像会被自动删除的原因排查与解决

    EasyNVR安防视频云服务是基于RTSP Onvif协议接入的视频平台 可支持将接入的视频流进行全平台 全终端的分发 分发的视频流包括RTSP RTMP HTTP FLV WS FLV HLS WebRTC等 平台丰富灵活的视频能力 可应
  • yaml语法及格式校验

    基本语法 1 yml文件以缩进代表层级关系 2 缩进不允许使用tab只能使用空格 3 空格的个数不重要 只要相同层级的元素左对齐即可 4 大小写敏感 5 数据格式为 名称 空格 值 也就是说 如果冒号后面有值 冒号后面必须要有空格 另外 后
  • 572. Subtree of Another Tree

    Given two non empty binary trees s and t check whether tree t has exactly the same structure and node values with a subt
  • 不用除号乘号完成除法(C++)

    这个问题是再力扣剑指offer上看到的 题目是 给定两个整数 a 和 b 求它们的除法的商 a b 要求不得使用乘号 除号 以及求余符号 第一印象看到这道题标注的是简单题 但我感觉他不简单 看了讲解之后感觉也不是很难 解题开始 首先一个思想