• 面试题65:不用加减乘除做加法(C++)


    题目地址:https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof/

    题目描述

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

    题目示例

    示例:

    输入: a = 1, b = 1
    输出: 2

    提示:

    • ab 均可能是负数或 0
    • 结果不会溢出 32 位整数

    解题思路

    拿到题目第一思路是二进制位运算,乘法考虑左移、除法考虑右移,那么加法和减法则考虑按位异或运算和按位与运算,计算a + b 等价于(a ^ b) + ((a & b) << 1),其中((a & b) << 1)表示进位。因此令b等于(a & b) << 1,令a等于a ^ b,直到b变成0,然后返回a。需要注意的是,计算进位的时候,需要使用unsigned int,因为C++不支持负值左移。举例来说,比如4 + 7 = 11,即a = 4 = 100,b = 7 = 111,则使用异或(两者不同,结果为1)运算求得没有进位的加法和,即a^b=011,然后使用按位与(两种均为1,结果才为1)运算计算进位,即a&b =100,我们发现结果并非我们所需的,这时,需要将a&b结果左移一位,这样可得到a&b << 1 = 1000。接下来,继续将进位结果与之前异或的值相加,得到新的结果,即1000^011 = 1011,继续按位与并左移一位,1000&011 << 1 = 0(进位为0结束),重复次过程,直到进位为0为止。

    程序源码

    class Solution {
    public:
        int add(int a, int b) {
            if(a == 0) return b;
            if(b == 0) return a;
            while(b != 0) //若b = 0,表示已经没有进位了
            {
                int tmp = a ^ b; //相加
                b = ((unsigned int) (a & b) << 1); //进位
                a = tmp;
            }       
            return a;
        }
    };
    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    javascript之理解参数按值传递
    javascript之模仿jQuery实现框架雏形
    javascript之正则表达式学习笔记
    python常用算法了解
    爬虫_小结04
    爬虫_小结03
    爬虫_小结02
    爬虫_小结01
    IO 模型
    数据库,前端和框架须知
  • 原文地址:https://www.cnblogs.com/wzw0625/p/12860499.html
Copyright © 2020-2023  润新知