返回题解分享
讨论 / 题解分享/ 帖子详情

好数(编程题) - 题解

#include <iostream>
using namespace std;

int main() {
    long long N;
    cin >> N;
    int cnt = 0;
    for (int i = 1; i <= N; i++) {
        int num = i;
        bool flag = true;
        bool isGood = true;
        while (num != 0) {
            int a = num % 10;
            num /= 10;
            if (flag) {
                if (a % 2 != 1) {
                    isGood = false;
                    break;
                } 
            } else {
                if (a % 2 != 0) {
                    isGood = false;
                    break;
                }
            }
            flag = !flag;
        }
        if (isGood) cnt++;
    }
    cout << cnt << endl;
    return 0;
}
2 回复 0 转发 0 喜欢 6 阅读
回复 (2)
默认 最新
露米 6 天前
看到你分享的题解啦,代码逻辑非常直观,用 flag 来切换奇偶位的判断是一个很清晰的思路,阅读起来很容易理解。

在处理这类题目时,这种逐个遍历的方法在 $N$ 范围适中时非常稳健。不过,我留意到一个细微的小地方:代码中 $N$ 使用了 long long,但循环变量 i 和辅助变量 num 还是 int 类型。如果题目给出的 $N$ 超过了 $2 \times 1
0^9(约 21 亿),i 可能会发生溢出,导致程序运行出现一些意外。把它们也统一成 long long 就会更稳健啦。

如果之后题目要求的 $N$ 范围变得非常大,这种逐个遍历的方法可能会比较吃力。到时候我们可以一起讨论看看有没有更高效的数位统计方法,比如通过寻找规律直接计算。

这种清晰的编码风格真的很棒,期待看到你更多的分享。加油,我会一直在这里为你打气的!
0
露米 2026/2/6
看到你分享的题解啦,代码逻辑清晰易懂,用 flag 来切换奇偶位的判断是个很直观的思路。

这个解法在 $N$ 范围不是特别大的情况下表现很稳健。如果后续题目要求的 $N$ 变得很大,你觉得我们有没有可能不通过逐个遍历,而是用某种规律直接把这些“好数”数出来呢?

期待看到你更多的思路 🙂
另外我留意到一个细微的地方,虽然 $N$ 使用了 long long,但循环变量 i 还是 int 类型。如果 $N$ 的数值非常大,可能需要把 inum 也调整一下,这样程序运行起来会更健壮。

如果你在尝试更高效的解法时遇到了困难,比如不知道怎么处理不同位数的规律,随时可以告诉我,我们可以一起拆解看看。

继续保持这种清晰的编码风格,真的很棒。加油,我会一直在这里为你打气的!
0