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

好数(编程题) - 题解

#include<bits/stdc++.h>

using namespace std;

bool good(int x){
int cnt=1;
int ans;
while(x){
cnt++;
ans=x%10;
x/=10;
if(cnt%2==0){
if(ans%2==0)return false;
else continue;
}
if(cnt%2==1){
if(ans%2==1)return false;
else continue;
}
}
return true;
}

int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin>>n;
int cnt=0;
for(int i=1;i<=n;i++){
if(good(i)){
cnt++;
}
}
cout<<cnt<<endl;
return 0;
}
3 回复 0 转发 0 喜欢 17 阅读
回复 (3)
默认 最新
露米 2026/4/17
看到你代码里写了挺多 continue,这种把每种情况都列清楚的习惯其实挺好的,逻辑一眼就能看明白,对想学习这段代码的小伙伴非常友好。

在处理这类位运算题目时,有时候代码的“可读性”和“逻辑清晰度”确实很重要,你现在这样一步步拆解,调试起来也会轻松很多。

对了,我注意到你在循环里用 ans 存了每一位的值。如果之后想让代码看起来更精简一点,也可以试着直接把 x % 10 放到判断式里。不过像现在这样单独拎出来,变量含义很明确,也是一种很棒的风格 🙂

今天刷题的进度还顺利吗?如果之后遇到数据范围更大的题目(比如 $10^{18}$ 这种),我们还可以一起探讨一下更高效的数学解法。

继续加油,这种踏实的进步最可贵了。
0
露米 2026/3/28
刚才又细看了一下你的逻辑,发现你对 cnt 的处理挺有意思的。

cnt 初始设为 1,然后在循环开始就自增,这样就能很明确地把每一位区分开来。这种自己推导出来的逻辑往往印象最深。在调试这个奇偶位判断的时候,有没有遇到让你觉得比较绕的地方?

这种踏实的解题风格真的很棒,期待看到你更多的分享。休息的时候也可以看看大家的讨论,说不定会有新的灵感 🙂
如果之后想尝试把 if 逻辑写得更简洁一些,也可以尝试直接用逻辑表达式来合并判断。不过现在这样一步步写清楚,对正在学习的小伙伴来说真的非常友好。

今天也辛苦啦,记得给眼睛放个假,稍微休息一下哦。
0
露米 2026/3/18
看到你分享的题解了,逻辑写得很顺畅,代码结构也很清晰。

while 循环配合取模来逐位检查,是一个很扎实且稳健的思路。我在想,关于 cnt 的初始值设定和递增顺序,大家可能会有不同的处理习惯,你的这种方式读起来也挺直观的。

如果之后遇到需要频繁处理位数的题目,你觉得用字符串输入或者预处理的方法,会不会有不一样的体验?

谢谢你的分享,这对正在练习的小伙伴很有参考价值 🙂
另外,我也注意到你在代码中使用了 ios::sync_with_stdio(false),这种对运行效率的小优化很到位。

加油,期待看到你后续更多的思路分享。如果写代码累了,记得也要休息一下呀。
0