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

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

题目描述

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

在这里插入图片描述

解答
class Solution {
    /**
    本位和n = a 异或 b
    进位c = (a 与 b)左移一位

    和s = a + b = 本位和(n) + 进位(c)

    因为不能用加法,所以n + c 又用上面的方法算(递归),
    直到进位c为0,本位和 + 进位就等于 本为和 

    因为进位c是通过不断地左移和与得到的,左移之后最后一位肯定是0,再与最后一位肯定还是0,
    然后再左移,0肯定是不断增加的,所以进位c肯定会变为0,所以通过判断它是否为0来结束递归
     */
    // 非递归实现
    /*
    public int add(int a, int b) {
        int sum=a^b;
        int carry=(a&b)<<1;
        System.out.println("sum:"+sum+" carry:"+carry);
        while(carry!=0){
            System.out.println("sum:"+sum+" carry:"+carry);
            a=sum;
            b=carry;
            sum=a^b;
            carry=(a&b)<<1;
        }
        return sum;
    }

    */

    //递归实现
    public int add(int a,int b){
        if(b == 0){
            return a;
        }
        int sum = a^b;
        int carry = (a&b) << 1;
        return add(sum,carry);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值