不用加减乘除做加法

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

一、描述

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号,本题OJ链接
数据范围:两个数都满足 −10≤n≤1000
进阶:空间复杂度 O(1),时间复杂度 O(1)

二、方法

分析:本题要求不能使用+、-、*、/,所以我们应该从二进制的角度去考虑,因为二进制的加法可以通过与(&)、或(|)、左移(<<)和或(|)来完成,并且二进制的话不用考虑正负数,直接对补码进行加法运算就行。但是具体怎么加呢?人去计算二进制相加很简单,直接通过肉眼就可以判断哪里要进位,哪里不需要,然后再最终相加,但是电脑不会这样做,那该怎么办呢?
思路:通过十进制相加思想推导出二进制相加思想
十进制相加思想(和平常的直接加法不同):
1、如果两数相加每一位都不会产生进位,则直接相加就是最终结果
2、如果两数相加会产生进位(无论哪几位产生进位都行),先计算不考虑进位的相加结果,记作a,再计算进位,记作b,然后把a和b看作新得到的两个数相加,看是情况1还是情况2,一直这样下去,直到计算出结果
例如,如下图所示:
不用加减乘除做加法,OJ,leetcode,算法
二进制相加思想
和上面十进制相加思想一样,只不过:
1、有没有产生进位通过相与来判断,相与结果为0,没有进位,否则,有进位。没有进位,两数相或就是最终结果;有进位,需要进一步计算,与的结果左移一位就是最终的进位
2、不考虑进位的相加结果通过异或可以完成
例如,如下图所示:
不用加减乘除做加法,OJ,leetcode,算法
分析:产生多少次进位,就循环多少次,最多不超过32次进位,时间复杂度O(1),空间复杂度O(1)
代码实现:文章来源地址https://www.toymoban.com/news/detail-691110.html

int Add(int a, int b )
{
    int n1 = 0;
    int n2 = 0;
    while(a & b) //判断是否有进位,有进位一直循环计算,直到没有进位为止
    {
        n1 = (a & b) << 1; //最终的进位
        n2 = a ^ b; //不考虑进位的相加结果
        a = n1; //作为新的a
        b = n2; //作为新的b
    }
    return a | b; //此时a&b不会产生进位,计算最终结果
}

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

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

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

相关文章

  • bigdecimal加减乘除运算

    打印的结果如下: 打印结果如下: 打印结果如下:

    2024年02月11日
    浏览(47)
  • 高精度(加减乘除)

    高精度的核心思想就是利用数组去储存大数,然后通过模拟手动计算的方式,来进行计算。 主要分三个模块: 1.读入数据并转换为(int)类型储存 核心思想:将每个位上的数字都+起来,如果大于10就进位。 核心代码如下: 完整代码及解析如下: 减法核心:只使用大数减小数

    2024年02月08日
    浏览(49)
  • C语言加减乘除运算

    加减乘除是常见的数学运算,C语言当然支持,不过,C语言中的运算符号与数学中的略有不同,请见下表。 加法 减法 乘法 除法 求余数(取余) 数学 + - × ÷ 无 C语言 + - * / % C语言中的加号、减号与数学中的一样,乘号、除号不同;另外C语言还多了一个求余数的运算符,就是

    2024年02月06日
    浏览(44)
  • 图像四则运算(加减乘除)

    实验目的: 1.了解图像的算术运算在数字图像处理中的初步应用。 2.体会图像算术运算处理的过程和处理前后图像的变化。 3.能够实现简单的图像处理 实验原理: 图像的代数运算包括加,减,乘,除,这些运算的主要对象是图像数据块中的数据。这四种代数运算可以由如

    2024年02月08日
    浏览(52)
  • 只使用位运算实现加减乘除

    在线OJ: LeetCode 29. 两数相除 原题目的要求是不能使用乘法, 除法和取余运算符实现除法. 在本篇博客中把题目要求提高一点, 这里只使用位运算来实现, 顺便的也就把只使用位运算实现加减乘除实现了. 首先我们需要知道两数之和可以是两个数位相加和不进位相加之和, 而两数进

    2024年02月06日
    浏览(49)
  • Rust 复数运算,重载加减乘除运算

    复数定义 由实数部分和虚数部分所组成的数,形如a+bi 。 其中a、b为实数,i 为“虚数单位”,i² = -1,即虚数单位的平方等于-1。 a、b分别叫做复数a+bi的实部和虚部。 当b=0时,a+bi=a 为实数; 当b≠0时,a+bi 又称虚数; 当b≠0、a=0时,bi 称为纯虚数。 实数和虚数都是复

    2024年02月13日
    浏览(38)
  • Python Opencv实践 - 图像的加减乘除

               

    2024年02月13日
    浏览(39)
  • Pytorch入门:Tensor加减乘除矩阵运算

    若张量维数大于2,则对最后两维进行matmul。进行此运算的要求是张量a与b除最后两维外的其他维必须一致:

    2024年02月12日
    浏览(46)
  • Java进行数字计算 BigDecimal计算(加减乘除)

    Double只能处理16位有效数精度,在某些情况下精度对其需求是不够的,所以就有了BigDecimal。因为BigDecimal的精度范围的范围大,所以在问我们的开发业务中对精度要求高的属性,就需要BigDecimal来进行存储计算,防止精度丢失。这里我主要介绍一下BigDecimal的加,减,乘,除。四

    2023年04月08日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包