返回

举一反三,算法解密:不用加减乘除做加法,开启脑洞风暴之旅

后端

算法思想:
我们要避开加减乘除这些操作,这里提供的方法是一个用位运算来实现加法的算法。位运算的速度非常快,因为它是直接操作底层的数据,避免了编译器和运行时的开销。

具体算法步骤:

  1. 把两个整数转成二进制。
  2. 用位与运算把两数的每一位的进位都记录到一个新的数。
  3. 用位异或运算把两数的每一位的值都记录到一个新的数。
  4. 如果新数的每一位的进位不为0,就重复2和3直到新数的每一位的进位为0。
  5. 把新数转成十进制。

算法实现:
这里我提供Java和Go两种实现,供你参考:

Java实现:

public class AddWithoutArithmetic {

    public static int add(int a, int b) {
        while (b != 0) {
            int carry = a & b;
            a = a ^ b;
            b = carry << 1;
        }
        return a;
    }

    public static void main(String[] args) {
        System.out.println(add(1, 2)); // 3
        System.out.println(add(10, 20)); // 30
        System.out.println(add(123, 456)); // 579
    }
}

Go实现:

package main

import "fmt"

func main() {
    fmt.Println(Add(1, 2)) // 3
    fmt.Println(Add(10, 20)) // 30
    fmt.Println(Add(123, 456)) // 579
}

func Add(a, b int) int {
    for b != 0 {
        carry := a & b
        a = a ^ b
        b = carry << 1
    }
    return a
}

算法分析:
这个算法的时间复杂度为O(log(min(a, b)),因为每一步我们都会把较小的数右移一位,所以最多需要log(min(a, b))步。

应用场景:
这个算法在很多领域都有应用,比如密码学、计算机图形学、图像处理等。

结语:
通过这篇博客,我们探索了一个非常有趣的算法。希望你能通过这个算法学到一些新的东西。