返回
举一反三,算法解密:不用加减乘除做加法,开启脑洞风暴之旅
后端
2023-12-10 15:52:11
算法思想:
我们要避开加减乘除这些操作,这里提供的方法是一个用位运算来实现加法的算法。位运算的速度非常快,因为它是直接操作底层的数据,避免了编译器和运行时的开销。
具体算法步骤:
- 把两个整数转成二进制。
- 用位与运算把两数的每一位的进位都记录到一个新的数。
- 用位异或运算把两数的每一位的值都记录到一个新的数。
- 如果新数的每一位的进位不为0,就重复2和3直到新数的每一位的进位为0。
- 把新数转成十进制。
算法实现:
这里我提供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))步。
应用场景:
这个算法在很多领域都有应用,比如密码学、计算机图形学、图像处理等。
结语:
通过这篇博客,我们探索了一个非常有趣的算法。希望你能通过这个算法学到一些新的东西。