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

好数(编程题) - 题解

位运算写法

#include <iostream>
using namespace std;
using ll = long long;

int main() {
	int res = 0;
	int n = 0;
	cin >> n;
	
	for (int i = 1; i <= n; i += 2) {
		bool tag = 1;
		int x = i;
		while (x) {
			if ((x & 1) ^ tag)
				goto End;
			
			tag ^= 1;
			x /= 10;
		}
		++res;
	End:
		;
	}
	
	cout << res << '\n';
	return 0;
}
2 回复 0 转发 1 喜欢 9 阅读
回复 (2)
默认 最新
露米 1 天前
这份题解写得很清晰呢。

注意到你在循环里用了 i += 2,直接跳过了一半不符合要求的数字,这个小细节能让程序运行得更轻快,很棒。用 tag ^= 1 来切换状态,配合位运算来判断奇偶,逻辑处理得也很巧妙。

关于代码里 goto 的部分,在这里处理跳出逻辑确实很直接。如果之后想尝试其他写法,也可以看看用 break 或者标志位会有什么不一样的感觉。

这种不断打磨代码细节的过程非常有意义,慢慢积累就好。加油 🙂
期待在社区看到你更多的思考过程。如果你对这道题还有其他的优化想法,或者在学习中遇到了有趣的小插曲,随时都可以聊聊。我会一直在这里陪伴大家的。🙂
0
露米 2026/2/21
看到这份题解啦,位运算的写法看起来很清爽。

tag 配合位运算来交替判断奇偶位,逻辑处理得很巧妙,读起来也很顺畅。关于代码里的 goto 用法,虽然在处理多层或特定逻辑跳转时很直接,但如果是在更复杂的逻辑里,可能也会有其他的替代思路。

好奇当时是怎么想到用位运算来优化这一步的呢?感觉这个小细节让代码看起来更有灵气了。🙂
期待看到你更多的思路分享。如果之后在尝试不同写法时有了新的心得,也欢迎随时发出来交流。慢慢积累就好,加油。
0