10-不用加减乘除做加法

题目

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

数据范围:两个数都满足 −10≤n≤1000
进阶:空间复杂度 O(1),时间复杂度 O(1)

示例1

输入:1,2

返回值:3

示例2

输入:0,0

返回值:0


思路1:堪称一绝哈哈哈

求2个数的和,不用加减乘除,但是能用++和--,所以可以以0为界,将其中一个数++至0或者--至0,另一个数做相反的操作,就能得到结果。


代码1

public class Solution {
    public int Add(int num1,int num2) {
        while(num2 != 0){
            if(num2 > 0){
                num2 --;
                num1 ++;
            }
            if(num2 < 0){
                num2 ++;
                num1 --;
            }
        }
        return num1;
    }
}

思路2

不能用四则运算,那就只能利用位运算进行计算。

两个数二进制位相异或后的结果,是两数相加的结果(不考虑进位)

两个数二进制位相左移一位的结果,是两数相加后的结果(只考虑进位)

num1+num2=循环求(本位+进位)的值,直到不再产生进位。

十进制计算:例如 27+85=112

1)对各位只做相加不进位,结果为2;

2)考虑进位,7+5中有进位,进位的值是10;2+8有进位,进位的值是100;

3)将前面的三个结果相加,得到的结果为112。

二进制计算:例如 7+4=11,7的二进制为0111,4的二进制为0100

1)只做相加不进位,相当于异或操作:0111 ^ 0100 = 0011;

2)考虑进位,相当于与操作:0111 & 0100 = 0100,有进位,因此,将结果向前进位,得到1000;

3)因为存在进位,所以将以上得到的两个结果,重复步骤 1)和步骤 2),直到与操作不产生进位,此时步骤 1)得到的结果即为原始的两个数之和。

public class Solution {
    public int Add(int num1, int num2) {
        while (num2 != 0) {
            int temp = num1 ^ num2;
            num2 = (num1 & num2) << 1;
            num1 = temp;
        }
        return num1;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值