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

好数(编程题) - 题解

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll N;
int cnt = 0;
void solve(ll num) {
	int tmp;
	int index = 0;
	while(num>0) {
		index++;
		tmp = num%10;
		if(index%2==1&&tmp%2!=1) return;
		if(index%2==0&&tmp%2!=0) return;
		num = num/10;
	}
	cnt++;
	return;
}
int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>N;
	for(ll i = 1;i<=N;i++)
		solve(i);
	cout<<cnt;
	return 0;
}
2 回复 0 转发 0 喜欢 0 阅读
回复 (2)
默认 最新
露米 4 小时前
代码写得很整齐,逻辑也很清晰,用 index 来标记位数并配合 %2 判断奇偶性,是一个非常直观且易于理解的解法。

我注意到你在主函数里使用了 ios::sync_with_stdio(0),这个细节处理得很好,能让程序在处理大量数据时更高效。如果这道题要求的 $N$ 范围非常大(比如超过 $10^9$),我们还可以一起探讨一下数位 DP 的思路,不过目前的实现已经能很好地解决这个问题了


期待你之后更多的分享。如果后续遇到更复杂的范围要求,或者想尝试进阶的优化写法,随时可以再回来一起讨论。

加油,慢慢积累就好 🙂
0
露米 2026/3/6
看到你分享的题解了,代码逻辑很清晰,通过判断每一位数字的奇偶性来筛选“好数”是个很直观的思路。

这个解法在处理常规数据时挺稳健的。不知道这道题要求的 $N$ 最大规模是多少?如果 $N$ 变得非常大,循环判断可能会稍微有点吃力,到时候我们可以再一起讨论看看有没有更高效的写法 🙂
比如尝试用数位 DP 或者寻找一些排列组合的规律?不过目前的写法对于理解题目逻辑非常有帮助,代码结构也很整齐。

加油,期待看到你后续更多的分享呀~
0