剑指offer 73. 不用加减乘除做加法

简介: 剑指offer 73. 不用加减乘除做加法

题目描述

写一个函数,求两个整数之和,要求在函数体内不得使用 +、-、×、÷ 四则运算符号。

数据范围

−1000≤num1,num2≤1000


样例

输入:num1 = 1 , num2 = 2
输出:3


方法一:位运算 O(1)


这道题可以总结为下面这个公式:


答案 = 没进位的和 + 进位 答案 = 没进位的和 + 进位答案=没进位的和+进位


这样一看可能会云里雾里的,我们来举个例子,假设 num1 二进制表示为 0 0 1 1 1 0 ,num2 二进制表示为 1 0 1 0 1 1 ,那么两者相加结果如下:


num1 = 0 0 1 1 1 0

num2 = 1 0 1 0 1 1

nums = 1 1 1 0 0 1

但是题目要求不能用到加法,所以我们可以将加法步骤进行拆分,分为没进位的和 sum 以及进位的数 carry :


sum = num1 ^ num2 = 1 0 0 1 0 1

carry = ( num1 & num2 ) << 1 = ( 0 0 1 0 1 0 ) << 1 = 0 1 0 1 0 0

可以发现,我们利用了异或和与运算的性质,可以得到 nums = sum + carry 。但前面说过了,不能用加法运算,所以我们只能将 num1 = sum, num2 = carry :


num1 = sum = 1 0 0 1 0 1

num2 = carry = 0 1 0 1 0 0

然后再重复上述步骤直至 num2 = carry 为 0 即没有进位时,就能得到最终答案即 num1 = sum 。

class Solution {
public:
    int add(int num1, int num2) {
        while (num2)
        {
            int sum = num1 ^ num2;  //没进位和
            int carry = (unsigned int)(num1 & num2) << 1; //进位
            num1 = sum, num2 = carry;
        }
        return num1;
    }
};


欢迎大家在评论区交流~

目录
相关文章
|
6月前
|
存储 C语言
大数的加、减、乘、除、幂运算(C语言)
大数的加、减、乘、除、幂运算(C语言)
|
6月前
加减乘除简单吗?不,一点都不,利用位运算实现加减乘除(代码中不含+ - * /)
加减乘除简单吗?不,一点都不,利用位运算实现加减乘除(代码中不含+ - * /)
|
6月前
|
C++
C++系列-第1章顺序结构-6-加法、减法和乘法
C++系列-第1章顺序结构-6-加法、减法和乘法
|
算法 C++
剑指offer(C++)-JZ65:不用加减乘除做加法(算法-位运算)
剑指offer(C++)-JZ65:不用加减乘除做加法(算法-位运算)
不用加减乘除做加法(简单难度)
不用加减乘除做加法(简单难度)
93 0
不用加减乘除做加法(简单难度)
|
Java
不用加减乘除做加法
不用加减乘除做加法
97 0
不用加减乘除做加法
力扣题 两数相除:画图解析 采用递归计算除法(不使用乘法、除法和 mod 运算符)
这是力扣上的一道题目,难度为中等,两数相除:给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
力扣题 两数相除:画图解析 采用递归计算除法(不使用乘法、除法和 mod 运算符)
|
存储 算法
高精度加法,模拟大数的加法运算
在处理特别大的数相加特别大的数的时候,long long不能直接通过加法算出结果的时候,可以通过高精度算法处理这些数的相加具体·思路如下; 首先 1 . 这些数存到数组的时候该如何排列,是个位放在第一位还是最后一位放到第一位,由于数的相加的候常常出现进位,常在最后一位加上一个数,而加上数的话往往在数组最后一位加上数比较方便,所以我们把第个位放在数组第一位 2.其次在调用模拟大数相加的函数中,我们该如何处理同一位上数相加出现的进位呢,我们可以设置一个 t 存储数组上某位相加最后吧 t%10 ,就可以得到想要的数,同时在 t / 10 如果 t 会的得到 1 或者 0.
133 0
|
机器学习/深度学习 存储
【LeetCode剑指offer65】不用加减乘除做加法(位运算)
(a & b) << 1能够计算a和b的所有进位值; a ^ b则是计算a和b的各位相加(不管进位值)
119 0
【LeetCode剑指offer65】不用加减乘除做加法(位运算)