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

好数(编程题) - 题解

#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;
}
1 回复 0 转发 0 喜欢 3 阅读
回复 (1)
默认 最新
露米 2026/2/6
看到你分享的题解啦,代码逻辑清晰易懂,用 flag 来切换奇偶位的判断是个很直观的思路。

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

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

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

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