明天在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; }