算法题每日一练---第55天:不用加号的加法

简介: 设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。

3.png

一、问题描述


设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。


题目链接:不用加号的加法


二、题目要求


样例

输入: a = 11, b = 13
输出: 24


考察

位运算基础、面试题
建议用时10~30min


三、问题分析


本题是位运算的第10题,没了解过位运算相关知识点可以看这一篇文章,讲解比较详细:

算法题每日一练---第45天:位运算


这一题主要考察的还是计算机的底层,要与位运算联系起来,我一开始怎么也没想到,后来看题解时发现了一个有趣的回答:

classSolution {
public:
intadd(inta, intb) {
returna-(-b);
    }
};

9.png

我大为震惊,确实没用到加法!

闲话少说,开始解题吧!这一题要用到位运算里面的异或、与、移位计算,这部分知识上面的文章链接里面都有,我就简单的讲一下。

以样例为例:

11->二进制:1011
13->二进制:1101
异或:      0110     与:1001     对与的结果左移:10010

异或加法操作只能计算一个位置是0,另一个位置是1的操作,假如两个位置都是1,那么本应该进位的结果,异或之后就变成0了,这个缺陷需要用弥补。

在这一题针对进位,比如101^101=101,只需要左移一位进位就完成了1010,进位完成

当不存在进位时,那么异或大法就成了。

我详细写一下步骤,a=a^b代表运算 ,  b=(a&b)<<1代表进位

a   0110    10100    10000    11000
b   10010   100      1000     0000

当b等于0时,输出结果。


四、编码实现


classSolution {
public:
intadd(inta, intb) {
if(b==0)//进位没有,输出结果      returna;
else//递归运算returnadd(a^b, ((unsignedint)a&b)<<1);
    }
};

unsigned int代表的是无符号位,要加上不然力扣处理负数的时候会报错。


五、测试结果8.png

相关文章
|
10月前
|
算法 C++
剑指offer(C++)-JZ65:不用加减乘除做加法(算法-位运算)
剑指offer(C++)-JZ65:不用加减乘除做加法(算法-位运算)
|
算法 C++ Python
【每日算法Day 66】经典面试题:不用四则运算如何做加法?
【每日算法Day 66】经典面试题:不用四则运算如何做加法?
112 0
|
存储 算法 大数据
基础算法-高精度加法
为什么要使用高精度算法 C++ 每一个变量都有自己的类型,每个类型都有自己的存储长度范围。
|
存储 算法
【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法
【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法
128 0
【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法
|
算法
算法题每日一练---第78天:二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target
168 1
算法题每日一练---第78天:二分查找
|
存储 算法
|
算法
算法题每日一练---第76天:丑数 l
丑数 就是只包含质因数 2、3 和 5 的正整数。
138 1
算法题每日一练---第76天:丑数 l
|
算法 C++
算法题每日一练---第67天:无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
115 0
算法题每日一练---第67天:无重复字符的最长子串
|
算法
【刷算法】不用加减乘除怎么做加法?
【刷算法】不用加减乘除怎么做加法?

热门文章

最新文章