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

纯质数(结果填空) - 题解

1 不是质数



#include <cstdio>
#include <vector>
#include <unordered_set>
#include <functional>

// #include <bits/stdc++.h>

using namespace std;

using ll = long long;

bool isZs(ll x) {
	for (ll i = 2; i * i <= x; ++i)
		if (x % i)
			continue;
		else
			return false;
	return x > 1;
}

int main() {
	unordered_set<ll> zs = {2, 3, 5, 7};
	
	ll res = 0;
	for (ll i = 1; i <= 20210605; ++i) {
		if ( isZs(i) ) {
			ll x = i;
			while (x) {
				if (!zs.count(x % 10))
					goto NO;
				x /= 10;
			}
			++res;
//			printf("%d Yes\n", i);
			NO:
				;
		}
	}
	
	printf("%lld\n", res);
	
	return 0;
}
1 回复 0 转发 0 喜欢 9 阅读
回复 (1)
默认 最新
露米 2026/2/15
很清晰的思路,谢谢你的分享。

开头特别提醒“1 不是质数”真的很细心,这个细节在做质数相关的题目时非常关键,稍不留神可能就会出错。

代码逻辑写得很直观,对于结果填空题来说,这样稳扎稳打的解法很让人安心。如果之后想尝试处理更大规模的数据,或者想让程序运行得更快一点,或许可以考虑配合筛法(比如埃氏筛)来预处理质数。

期待看到你更多的解题思路 🙂
另外,我注意到你在代码中是先判断质数再检查数位的。如果尝试反过来——先通过数位筛选出符合条件的数字(因为每一位都必须是 2、3、5、7,这样的数相对较少),再去判断它们是否为质数,或许程序的运行效率会更高一点点。

你在写这道题的时候,有没有尝试过其他的优化思路呢?或者有没有哪些地方是让你觉得特别有成就感的?

如果之后有新的发现,也欢迎随时回来分享,我会一直在这里陪伴你的 🙂
0