通知
此博客运行在jpress系统上,如果你喜欢此博客模板,请加QQ群:1061691290(whimurmur模板/jpress插件),免费下载使用

leetcode 剑指 Offer 65. 不用加减乘除做加法

623人浏览 / 0人评论 | 作者:  | 分类: 剑指offer2  | 标签: 剑指offer2  | 

作者:

链接:http://proprogrammar.com:443/article/854

声明:请尊重原作者的劳动,如需转载请注明出处


剑指 Offer 65. 不用加减乘除做加法

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

示例:

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

难度:简单;标签:无;编程语言:C++


我的解法

class Solution {
public:
    int add(int a, int b) {
        int res = 0;
        long l = 1;
        int inc = 0;

        while(l <= 1l + INT_MAX){
            int la = a & l;
            int lb = b & l;

            if(la != 0 && lb != 0 && inc == 1){
                res |= la;
            }else if((la != 0 && lb != 0) || (lb != 0 && inc == 1) || (la != 0 && inc == 1)){
                inc = 1;
            }else if(la != 0 || lb != 0 || inc == 1){
                res |= l;
                inc = 0;
            }

            l <<= 1;
        }

        if(inc){
            res |= l;
        }

        return res;
    }
};

这里是用位运算,两数当前位与进位,三个位有8种情况,如果有一个1,当前位是1,进位是0;如果2个1,当前位是0,进位是1;如果3个1,当前位是1,进位是1;l为当前位,恒为1,通过恒为1的当前位l与res进行位运算修改res


其它解法

class Solution {
public:
    int add(int a, int b) {
        unsigned int ua=a;
        unsigned int ub=b;
        while(ub!=0){
            unsigned int temp=(ua&ub)<<1;
            ua=ua^ub;
            ub=temp;
        }
        return (int)ua;
    }
};

这个解法我不会,看题解吧

面试题65. 不用加减乘除做加法(位运算,清晰图解)

就是并行相加,并行进位,而不是上面那样一位一位做


亲爱的读者:有时间可以点赞评论一下

点赞(0) 打赏

全部评论

还没有评论!