1 条题解

  • 0
    @ 2026-8-5 14:01:00

    题解:偶校验位

    思路

    对每个数不断检查最低位:

    • x & 1 得到最低位;
    • x >>= 1 删除最低位。

    只需要记录 1 的总数是奇数还是偶数,不必保存完整计数。最后若总数为奇数,输出 1;否则输出 0

    也可以使用 __builtin_popcount,但手写循环更能体现位运算过程。

    复杂度

    每个数最多处理 3232 位,时间复杂度 O(32n)O(32n),即 O(n)O(n);空间复杂度 O(1)O(1)

    参考代码

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
        int p = 0;
        for (int i = 0; i < n; i++) {
            unsigned int x;
            cin >> x;
            while (x > 0) {
                p ^= (x & 1u);
                x >>= 1;
            }
        }
        cout << p << "\n";
        return 0;
    }
    

    信息

    ID
    5113
    时间
    1000ms
    内存
    128MiB
    难度
    7
    标签
    递交数
    21
    已通过
    7
    上传者