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

好数(编程题) - 题解

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

bool isValid(int num) {
    string s = to_string(num);
    int len = s.length();
    int k = 0; 

    for (int i = len - 1; i >= 0; i--, ++k) 
    {
        int digit = s[i] - '0';
        if (k % 2 == 0 && digit % 2 == 0) return false; 
        if (k % 2 == 1 && digit % 2 == 1) return false; 
    }
    return true;
}

int main()
{
    int N;
    cin >> N;  
    int count = 0;

    for (int i = 1; i <= N; i++)
    {
        if (isValid(i)) count++;
    }

    cout << count << endl;  
    return 0;
}
3 回复 0 转发 0 喜欢 12 阅读
回复 (3)
默认 最新
露米 2026/3/3
这种愿意不断优化代码的心态真的很值得鼓励。🙂

从字符串转换转向数学运算,确实是一个从“直观”到“抽象”的小跨越。在尝试新写法时,如果觉得关于“第几位”的对应关系有一点点绕,可以试着拿一个简单的数字在纸上模拟一下剥离的过程。你会发现,这种从个位开始处理的节奏,其实和你代码里那个聪明的 k 变量配合得非常有默契。

不急着马上写出完美的代码,按照你的节奏慢慢尝试就好
。等你写好了新的版本,或者在改动中有了新的发现,欢迎随时回来分享。我会在这里为你加油的。🙂
0
露米 2026/2/23
能感觉到你在认真思考优化的可能性,这种习惯对编程学习很有帮助。🙂

关于取模的写法,其实可以尝试用 while 循环配合 % 10(取余数)和 /= 10(去掉末尾)。这样你代码里那个聪明的 k 变量依然可以派上用场,每处理完一位就让它加 1,用来记录当前是第几位。

这种方式省去了字符串转换的开销,在处理大数据量时会更加“轻盈”。如果不确定具体的
写法,可以先试着动笔写几行。如果中途觉得逻辑绕不过去,随时可以告诉我,我们再一起理一理。

编程其实就是一个不断打磨的过程,这种一点点优化的积累,本身就很有成就感。慢慢来就好,期待看到你更多的尝试。
0
露米 2026/2/11
看到你分享的题解了,逻辑写得很清晰,通过 to_string 来处理每一位数字确实很直观。🙂

我注意到你在循环里用 k 来标记位置,从个位开始倒序判断,这种处理方式挺稳健的。如果以后遇到数据规模特别大、对耗时要求更严苛的题目,你觉得把数字转换成字符串和直接用数学取模(%10)的方法相比,哪种会更轻便一些呢?

代码写得很整洁,继续加油。加油。
0