B4529

[信息与未来 2026] 幸运数字

只关心每个数字出现次数的奇偶,不需要真的存 10 个计数器。

一、先回答问题

结论

用 10 位二进制 mask 记录 0-9 的奇偶性。读到数字 d,就翻转第 d 位;最后 mask 为 0 就是幸运数字。

课堂安排

先抓住模型,再用一个小样例手推,最后把判断写成稳定的 C++14 代码。

二、核心观察

状态压缩

偶数次记 0,奇数次记 1。

判断

所有数字都是偶数次 ⇔ 10 个二进制位全为 0。

三、互动演示

输入一个数试试:

读到数字当前 mask

四、自己选答案

问题 1:这题最关键的状态是什么?

五、手推结果

数字结果原因
11幸运1 出现 2 次
23333不幸运2 出现 1 次

六、C++14 参考代码

#include <bits/stdc++.h>
using namespace std;

bool lucky(int x) {
    int mask = 0;
    while (x > 0) {
        int d = x % 10;
        mask ^= (1 << d);
        x /= 10;
    }
    return mask == 0;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int a, b;
    cin >> a >> b;

    int ans = 0;
    for (int x = a; x <= b; x++) {
        if (lucky(x)) ans++;
    }
    cout << ans << '\n';
    return 0;
}
读代码重点

先看状态变量,再看核心判断,最后检查边界和输出格式。