求 1 ~ 1e7 以内素数的个数
最普通做法(非常超时
| int n; |
| bool judge(int x) |
| { |
| if(x == 1) return false; |
| for(int i = 2; i < x; i++) |
| { |
| if(x % i == 0) return false; |
| } |
| else return true; |
| } |
| int main() |
| { |
| cin >> n; |
| int count = 0; |
| for(int i = 2; i < n; i++) |
| { |
| if(judge(i)) count++; |
| } |
| cout << count; |
| } |
普通做法(超时
| |
| bool judge(int x) |
| { |
| if(x == 1) return false; |
| for(int i = 2; i <= x / i; i++) |
| { |
| if(x % i == 0) return false; |
| } |
| else return true; |
| } |
| |
| |
| |
| |
埃式筛法(快
核心
筛去出现的第一个素数的所有倍数 => 这样没有被筛掉的第一个数
肯定是素数,就不需要判断是不是素数了
实现筛去
用一个bool类型的数组
或者 bitset
(会慢几十ms)来存储每个值是否是素数,当前素数的倍数则是true, 实现筛去只有满足false的条件(即未被筛去)才能进行
不足
一个元素可能会重复筛去,因为它同时是几个素数的倍数
例如
i = 2时,会筛掉4,6,8,10,12
,14....
i = 3时,会筛掉9,12
....
这里12就筛重复了(这是已经改进了一点的结果,没改进之前,int j = i * 2,重复筛掉的就更多,例如6)
| const int N = 1e7 + 10; |
| int st[N]; |
| int n; |
| int main() |
| { |
| cin >> n; |
| int count = 0; |
| for(ll i = 2; i <= n / i; i++) |
| if(!st[i]) |
| for(ll j = i * i; j < n; j += i) judge[j] = 1; |
| |
| for(int i = 2; i <= n; i++) |
| if(!st[i]) count++; |
| |
| cout << count; |
| } |
- 利用2个for,但是重复筛去的元素更多,1e6的数据平均在15ms(时间波动有点大)
| const int N = 1e7 + 10; |
| bool judge[N]; |
| int n; |
| int main() |
| { |
| cin >> n; |
| int count = 0; |
| for(int i = 2; i <= n; i++) |
| { |
| if(!judge[i]) |
| { |
| count++; |
| for(int j = i * 2; j <= n; j += i) judge[j] = true; |
| } |
| } |
| cout << count; |
| } |
欧式筛法(最快
核心
合数 = 最小的素数 * 另一个数
,只有prime[j]是最小的质因数时i才能被筛掉
例如 24 = 3 * 8 = 3 * 2 * 2 * 2 = 2 * 12,要在另一个数为12时才能筛掉,不然就会重复
1e6数据的时间<10ms
核心代码
| if(i % prime[j] == 0) break; |
代码实现
| #include <iostream> |
| |
| using namespace std; |
| const int N = 1e6 + 10; |
| int prime[N]; |
| bool judge[N]; |
| |
| int main() |
| { |
| int n = 1e6, k = 0; |
| for(int i = 2; i <= n; i++) |
| { |
| if(!judge[i]) prime[k++] = i; |
| for(int j = 0; j < k; j++) |
| { |
| if(i * prime[j] > n) break; |
| judge[i * prime[j]] = true; |
| if(i % prime[j] == 0) break; |
| } |
| } |
| cout << k; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程