1018: 可被5整除的二进制前缀
题意:计算 nums 每个前缀的二进制数值 x,判断 x 是否为 5 的倍数。
比如 nums=[1,1,0,1],每个前缀对应的二进制数分别为 1,11,110,1101。如何计算这些二进制数呢?在十进制中,我们往 12 的右边添加 3,得到 123,做法是 12⋅10+3=123。对于二进制,做法类似,往 110 的右边添加 1,得到 1101,做法是 110⋅2+1=1101,或者 110 << 1 ∣ 1=1101。

注意本题 nums 很长,算出的二进制数 x 很大,但我们只需要判断 xmod5=0 是否成立。可以在中途取模,也就是每次循环计算出新的 x 后,把 x 替换成 xmod5。为什么可以在中途取模?

**模运算对乘法和加法具有分配律,所以每一步更新时都可以先取模再运算,不影响最终模 5 的结果。**这样既节省了空间,又避免了超大整数问题。
class Solution {
public:
vector<bool> prefixesDivBy5(vector<int>& nums) {
vector<bool> ans;
int x=0;
for(int i=0;i<nums.size();i++){
x=(x<<1 | nums[i])%5; //等价于x*2+nums[i]
ans.push_back(x==0);
}
return ans;
}
};