今天在leetcode刷到一题:
https://leetcode-cn.com/probl...
要求计算1到n的和,不能用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
这题有个很好的做法,即使用俄罗斯农民乘法,虽然这里因为不能用循环所以只能手动展开,但是俄罗斯农民乘法的思想是值得借鉴的。
俄罗斯农民乘法
【俄罗斯农民乘法】有两个数A和B相乘,如果两个数非常大,乘积可能溢出,那么我们可以将B二进制展开,枚举B的每一位,如果第i位是1,那么和A相乘结果应该是A * (1 << i)也就是A << i,只要在每次运算的时候取模,最后结果再取模,就可以避免数值越界。
public static int quickMul(int a, int b){
int ans = 0;
while (b > 0){
if((b & 1) == 1){
ans += a;
}
a <<= 1;
b >>= 1;
}
return ans;
}
推荐阅读
- 学习java的十大理由
- Serializable接口的作用
- 程序人生|公司来了个卷王,我愿称之为王中王,让人崩溃
- 编程语言|现代编程语言(zig)
- Java|被裁了,39 岁阿里 P9,攒下 1.5 亿....
- 22 条 API 设计最佳实践,快收藏。。
- 数据结构|数据结构 Java数据结构 --- Lambda表达式
- JDK|阅读 JDK 源码(HashMap 扩容总结及图解)
- 数据结构|数据结构 Java数据结构 --- 枚举