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

好数(编程题) - 题解

#include <iostream>
using namespace std;
int a[10001];
int ans=0;
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		if(i<10&&i%2!=0)
		ans++;
		if(i>=10&&i<100&&(i%10)%2!=0&&(i/10)%2==0)
		ans++;
		if(i>=100&&i<1000&&i%10%2!=0&&i%100/10%2==0&&i/100%2!=0)
		ans++;
		if(i>=1000&&i<10000&&i%10%2!=0&&i%100/10%2==0&&i%1000/100%2!=0&&i/1000%2==0)
		ans++;
		if(i>=10000&&i<100000&&i%10%2!=0&&i%100/10%2==0&&i%1000/100%2!=0&&i%10000/1000%2==0&&i/10000%2!=0)
		ans++;
		if(i>=100000&&i<1000000&&i%10%2!=0&&i%100/10%2==0&&i%1000/100%2!=0&&i%10000/1000%2==0&&i%100000/10000%2!=0&&i/100000%2==0)
		ans++;
		if(i>=1000000&&i<10000000&&i%10%2!=0&&i%100/10%2==0&&i%1000/100%2!=0&&i%10000/1000%2==0&&i%100000/10000%2!=0&&i%1000000/100000%2==0&&i/1000000%2!=0)
		ans++;
		
	}
	cout<<ans;
	return 0;
}
5 回复 0 转发 3 喜欢 18 阅读
回复 (5)
默认 最新
露米 2 天前
看到你把 1 到 7 位数的情况都考虑到了,这份耐心真的很棒。这种解法虽然看起来“代码量”大了一点,但它能让你非常直观地理解题目中“奇偶位”的要求。

现在的代码处理七位数以内都很稳当。不过我们可以试着挑战一下:如果题目要求的数字范围变得更大,比如到了十位甚至更长,这些 if 是不是就写不过来了呀?

其实你代码里那些重复的 %10/10 已经给了我们提示。我们可以试着找一个“小助手”(比如一个变量 pos)来帮我们记下当前是在处理第几位,每处理完一位,就让 pos 加 1,并把数字缩小 10 倍。这样,不管数字有多长,都能用同一套逻辑去处理了。

你可以先在脑海里模拟一下这个“剥洋葱”的过程。如果觉得逻辑上哪里绕不过去,随时告诉我,我们一起理理思路 🙂
在这个过程中,你可以观察一下数字的第 1 位(个位)、第 2 位(十位)…… 它们的奇偶性要求其实是有规律交替的。

不着急一次性写得完美,哪怕只是先尝试把其中两个 if 逻辑合并,也是很棒的进步。期待看到你优化后的版本,加油呀 🙂
0
露米 2026/4/10
看到你为了覆盖所有位数写了这么多行代码,真的能感受到你的这份认真和耐心,这种踏实的解题态度在编程学习中非常可贵。

这种“暴力”解法虽然看起来代码量大了一些,但它能帮你非常直观地理顺每一位的奇偶要求。如果你之后想尝试让代码变得更清爽,可以观察一下:数字的每一位其实都在遵循“奇偶交替”的规律。

我们可以试着把数字“拆”开,用 x % 10 拿到最后一位,然后用 x / 10 把它去掉。配合一个记录“第几位”的小计数器,或许就能用一个简单的循环搞定所有位数的判断了。

你可以先试着在脑海里模拟一下这个“剥洋葱”的过程。如果觉得逻辑上哪里绕不过去,随时告诉我,我们一起理理思路 🙂
另外,关于那个记录位数的计数器,你可以思考一下:是从个位开始往左数(1, 2, 3...),还是从最高位开始往右数,对你判断奇偶位会更方便呢?

慢慢来,不着急一步到位。期待看到你的新思路,加油呀 🙂
0
露米 2026/3/23
我又仔细看了一下你的代码,发现你对每一位奇偶性的判断抓得很准,逻辑其实已经非常清晰了。

如果后面想挑战一下把这些 if 合并,可以试着写一个专门负责判断的函数,比如 bool check(int x)。这样主程序里就只需要写 if(check(i)) ans++; 了,代码看起来会清爽很多,就像把散落的零件装进了一个整洁的收纳盒。

这种“模块化”的思路在处理更复杂的题目时会很有帮助。你可以先从“如何用循环取出数字的每一位”开始尝试,如果在这个小地方卡住了,随时跟我说,我们一起拆解它 🙂
在这个过程中,你可以观察一下数字的第 1 位(个位)、第 2 位(十位)…… 它们的奇偶性要求其实是有规律交替的。

不着急一次性写得完美,哪怕只是先尝试把其中两个 if 逻辑合并,也是很棒的进步。期待看到你优化后的版本,加油呀 🙂
0
露米 2026/3/16
看到你已经把每个位数的规律都找出来了,真的很细心。

这种“暴力”解法其实是理解题意最扎实的第一步。如果你想尝试把代码变得更精简,可以观察一下:不管是哪一位,我们其实都在重复“取出最后一位”和“检查它是第几位”这两件事。

可以试着想一想,如果用一个 while 循环配合一个简单的计数器(比如从 1 开始计数的 pos),是不是就能把这些复杂的 if 逻辑合并起来了呢?

不着急立刻写出来,可以先试着构思一下这个小循环。如果过程中有哪里觉得绕不过去,随时告诉我,我们一起理一理 🙂
另外,关于那个 pos 计数器,你可以思考一下:是从低位(个位)往高位去数,还是从高位往低位去数,对于判断“奇偶位”会更方便呢?

等你有了新的思路,或者在尝试中遇到了新的小疑问,欢迎随时回来分享。加油呀 🙂
0
露米 2026/3/13
看到你把每一位的情况都认真考虑到了,这种踏实解题的态度很棒呢。

代码的逻辑很直观,一眼就能看出你是如何根据位数来判断奇偶要求的。不过我也在想,如果题目要求的范围变得更大,写这么多 if 语句可能会稍微辛苦一些。

或许可以试着写一个通用的函数,利用循环和取余(%10)的方法来逐位检查?这样代码可能会更简洁一些。

你可以先往这个方向尝试一下,如果过程中卡住了,随时可以跟我说,我们一起看看怎么优化 🙂
另外,在构思通用函数时,可以尝试用一个变量来标记当前处理的是第几位,看看这样会不会让逻辑更清晰一些。

期待看到你的新思路,加油呀。
0