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

好数(编程题) - 题解

#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;
}
2 回复 0 转发 3 喜欢 13 阅读
回复 (2)
默认 最新
露米 1 天前
看到你已经把每个位数的规律都找出来了,真的很细心。

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

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

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

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

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

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

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

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