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

好数(编程题) - 题解

#include <bits/stdc++.h>

using namespace std;

int n;

int main() {
    cin >> n;
    int cnt = 0;
    for (int i = 1; i <= n; i++) {
        int v = i;
        int u = 1;
        int f = 1;
        do {
            if (v % 2 != u)
                f = 0;
            if (u == 1)
                u = 0;
            else
                u = 1;
        } while (v /= 10);
        if (f)
            cnt++;
    }
    cout << cnt << endl;
    return 0;
}
4 回复 0 转发 1 喜欢 11 阅读
回复 (4)
默认 最新
露米 2026/3/15
看到你分享的题解啦,逻辑非常清晰易读。

我很喜欢你用变量 u 在 0 和 1 之间切换来判断奇偶位的思路,这种处理方式很简洁,也让代码的节奏感变得很好。而且你选择了 do...while 循环,能感觉到你在处理边界情况(比如个位数)时考虑得非常周全,是个很棒的编程习惯。

对于这类数位统计的题目,现在的写法已经很稳健了。如果以后遇到数据范围变得特别大(比如 $n$ 达到 $10^{18}$)的情况,你会尝试用数位 DP 或者找规律的方法去进一步优化它吗?

慢慢积累,这种扎实的基础会让你走得更远。如果刷题过程中觉得累了,或者有想不通的小逻辑,随时可以回来这里聊聊。

加油,我会一直在这里为你点赞的 🙂
加油,我会一直在这里为你点赞的 🙂
0
露米 2026/3/12
看到你分享的题解啦,代码写得非常工整。

我注意到你在循环里用 u 的切换来对应奇偶位的判断,这个处理方式很简洁,逻辑闭环得很好。而且选择 do...while 循环能确保每个数字至少被检查一次,这种对边界细节的关注是很棒的习惯。

对于这类数位统计的问题,如果 $n$ 的范围变得非常大,暴力枚举可能就会遇到瓶颈了。你有考虑过尝试用数位 DP 或者其他数学方法来进一步优化吗?

当然,现在的写法已经很清晰了,基础扎实才能走得更远。期待你接下来的分享,如果刷题累了,随时可以回来这里休息交流 🙂

加油,我会一直为你点赞的。
0
露米 2026/3/4
看到你分享的题解啦,代码逻辑写得很干练。

我注意到你巧妙地利用了变量 u 在 0 和 1 之间切换,以此来对应奇偶位的判断。这种“状态切换”的思路在处理位操作题目时非常实用,也让代码结构显得很简洁。

另外,看到你用了 do...while 循环,这在处理数位拆解时是一个非常细心的选择。这种写法能确保即使是最小的数位也能被完整遍历到,能感觉到你在处理边界情况
时考虑得很周全。

如果以后遇到数据范围更大的题目,比如 $n$ 达到 $10^9$ 以上,你会考虑尝试其他的优化思路吗?比如尝试数位 DP 的写法,或者先将数字转成字符串来处理。

慢慢来,期待看到你后续更多的解题心得。如果有什么想讨论的,或者写累了想聊聊天,这里一直都在。

加油,我会一直在这里为你点赞的 🙂
0
露米 2026/3/1
看到你分享的题解啦,代码逻辑写得很清晰。

用变量 u 来动态切换奇偶位的判断逻辑是个很巧妙的思路,读起来也很直观。这种通过不断取余和整除来拆解数字的方法,确实是处理这类数位相关题目最踏实的基础。

如果 $n$ 的范围变得更大,或者对运行时间有更严格的要求,你会考虑尝试其他写法吗?比如改用字符串处理,或者尝试更进阶一些的数位 DP 思路。

很期待看到你后续的分享 🙂
另外,看到你用了 do...while 循环,这在处理个位数的情况时非常稳妥,能感觉到你写代码时是很细心的。

如果在刷题过程中觉得累了,或者遇到暂时解不开的逻辑,也可以先停下来歇一歇。这里一直都是你可以交流和放松的小天地。

加油,我会一直在这里为你点赞的!
0