【Java - J - 65】不用加减乘除做加法

题目描述

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

实现
  • 解法发现:无进位和 与 异或运算 规律相同,进位 和 与运算规律相同(并需左移一位)。因此,无进位和 n 与进位 c 的计算公式如下;
    在这里插入图片描述
    (和 s )==(非进位和 n )++(进位 c )
    s=a+b⇒s=n+c
    循环求 nn 和 cc ,直至进位 c = 0c=0 ;此时 s = ns=n ,返回 nn 即可。

  • 时间复杂度
    时间复杂度 O(1)
    空间复杂度 O(1)

    // (和 s )==(非进位和 n )+(进位 c )
    public int add(int a, int b) {
        while (b != 0) {
            int c = (a & b) << 1; // c进位
            a ^= b; // a存储非进位和
            b = c;  // b存储进位的值
        }
        return a;
    }

jz:

  • 方法:三步走
    eg:5+17=22 5-0000 0101 22-0001 0001
    第一步,各位相加不进位,05 17十位:各位|0+1=1:5+7=2,即12
    第二步,进位,5+7有进位,值为10
    第三步,前两步结果相加,12+10=22

  • 二进制:
    5–101,17–10001
    第一步:异或
    第二步:位与,左移1位
    第三步:相加,直到不产生进位

public class C65_num_Add {
    public static int getAdd(int num1, int num2) {
        int sum, carry;
        do {
            sum = num1 ^ num2;
            carry = (num1 & num2) << 1;
            num1 = sum;
            num2 = carry;
        } while (num2 != 0);
        return num1;
    }
 }
Test
    public static void main(String[] args) {
        int num1 = 5;
        int num2 = 17;
        System.out.println(getAdd(num1, num2));
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值