每日一题----计数质数

这篇博客介绍了如何利用埃拉托斯特尼筛法来优化计算小于给定数n的质数数量的问题。通过示例展示了算法的应用,如输入n=10时,返回质数个数为4。文章强调了避免暴力求解,采用筛法提高效率,适合对算法感兴趣的读者阅读。

给定一个数n,统计小于n的数中质数的个数

示例1:
输入:n = 10
输出:4
解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。

示例 2:
输入:n = 0
输出:0

示例3:
输入:n = 1
输出:0

显而易见,该题用暴力解法的话(这里包括最优求解素数),没什么意义;故需要寻找更优解:埃拉托斯特尼筛法

埃拉托斯特尼筛法的具体思想可见此:形象生动的体现了算法的思想.

class Solution {
    public int countPrimes(int n) {
        boolean[] arr = new boolean[n];
        int cnt = 0;
        for(int i = 2; i < n; i++) {
            if(arr[i]) continue;
            cnt++;
            for(int j = i; j < n; j+=i) {
                arr[j] = true;
            }
        }
        return cnt;
    }
}

如果这篇文章对你有所帮助,请点个赞吧!谢谢鼓励!

09-18
### CSP-S 算法竞赛概述 CSP-S(Certified Software Professional – Senior)是中国计算机学会(CCF)主办的信息学奥林匹克系列赛事中的提高组认证考试,主要面向高中阶段学生,考察其在算法设计、程序实现和问题分析方面的综合能力[^1]。 该竞赛分为两个部分:初赛与复赛。 - **初赛**为笔试形式,侧重理论知识考查,包括但不限于数据结构、算法原理、时间复杂度分析、离散数学基础等内容。 - **复赛**为机试形式,要求选手现场编写可运行并通过测试用例的程序,重点检验实际编码能力和调试技巧[^1]。 --- ### 主要考点分布 #### 一、基本语法与编程基础 掌握 C++ 是参加 CSP-S 的必备前提,尤其是 STL 容器(`vector`, `map`, `set`, `queue`)、输入输出优化(如 `scanf/printf` 或关闭同步流)以及函数封装习惯[^1]。 ```cpp #include <iostream> #include <vector> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); vector<int> a; int n; cin >> n; while (n--) { int x; cin >> x; a.push_back(x); } for (auto &v : a) cout << v << ' '; return 0; } ``` #### 二、核心算法模块 ##### 1. 排序与查找 常见排序算法的理解及其稳定性、时间复杂度比较;能熟练应用 `sort()` 函数配合自定义比较逻辑处理区间或对象排序问题[^1]。 ##### 2. 枚举与模拟 通过循环嵌套完成状态穷举,适用于小规模数据集的问题求解;模拟类题目注重细节控制,比如日期推算、游戏过程还原等[^1]。 ##### 3. 贪心策略 典型模型包括活动安排、背包问题简化版、任务调度等。需注意贪心选择性质是否成立,并辅以反证法验证正确性[^1]。 ##### 4. 动态规划(DP) 高频考点之一,覆盖线性 DP、背包型 DP、区间 DP 和树形 DP 基础形态。应熟悉状态转移方程构建方法,能够识别最优子结构性质[^1]。 ```cpp // 0-1 背包模板 const int MAXN = 1e3+5; int dp[MAXN]; for (int i = 0; i < n; ++i) for (int j = W; j >= w[i]; --j) dp[j] = max(dp[j], dp[j-w[i]] + v[i]); ``` ##### 5. 图论初步 涉及邻接表建图、DFS/BFS 遍历连通分量、拓扑排序、最短路(Dijkstra, SPFA)及最小生成树(Prim/Kruskal)。常用于解决路径查询、依赖关系等问题[^1]。 ##### 6. 数论与组合数学 模运算、最大公约数(gcd)、快速幂、素数判定、排列组合计数是基础知识要点。扩展欧几里得算法偶有出现于不定方程场景中[^1]。 ##### 7. 数据结构进阶 栈、队列、优先队列(堆)、并查集广泛应用。其中并查集支持按秩合并与路径压缩,在集合动态维护中有显著性能优势[^1]。 ```cpp struct UnionFind { vector<int> fa, rank; UnionFind(int n): fa(n), rank(n,1) { iota(fa.begin(), fa.end(), 0); } int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); } void merge(int p, int q) { int u = find(p), v = find(q); if (u != v) { if (rank[u] < rank[v]) swap(u,v); fa[v] = u; rank[u] += rank[v]; } } }; ``` --- ### 备考建议与学习路径 建立系统化的训练体系至关重要: - 初学者宜从洛谷 P 系列入门题起步,逐步过渡至 NOIP 历年真题; - 每日坚持刷题不少于两道,分类攻克各知识点盲区; - 对错题进行归档整理,记录错误原因与改进方案; - 参加线上虚拟比赛提升临场应对能力,适应限时压力环境[^1]。 推荐资源平台: - [Luogu](https://www.luogu.com.cn/) 提供大量中文题库与社区讨论 - [AcWing](https://www.acwing.com/) 含专题讲解视频与配套练习 - LeetCode 中文站可用于巩固基础数据结构操作 --- ### 近年命题趋势分析 近年来试题更加强调思维灵活性而非单纯码量堆积。例如: - 使用位运算替代布尔数组节省空间; - 结合前缀和技术降低暴力枚举的时间开销; - 设定边界特判条件防止越界访问引发 RE 错误[^1]。 同时,阅读理解能力也成为隐性考核维度——部分描述冗长的实际应用场景需要精准提取抽象模型。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值