Description
Solution
第一眼觉得有点离谱,啥都不让用;突然想到一种只用加减和移位运算符来模拟乘法的方法,核心思想类似快速乘(龟速乘),将乘数进行二进制差分,对被除数进行移位后再相加。
Code
class Solution {
public:
typedef long long ll;
ll mul(ll a,ll b) {
ll res = 0, cnt = 0;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
return res;
}
int sumNums(int n) {
int res = mul(n+1,(n>>1)) + mul((n&1),((n+1)>>1));
return res;
}
};