思路:
在求小于等于n的所有素数之和的时候,首先应把[1:n]内的全部素数找出来,采用素数定义的方法找素数会比较慢,而筛法则较快。
筛法的基本思想就是对任意的合数a(1<=a<=n),其必定有一个素因子p(1<=p<=a^0.5),而a的0.5次方小于等于n的0.5次方,所以有1<=p<=n的0.5次方,那么我们从1到n的0.5次方遍历一遍找出所有的素数,求其倍数,就能找出[1:n]内的所有合数,筛去合数后,剩下的自然是素数。
代码如下
- 基本筛法
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
bool prime[1000001];
void eratosthenes(int n){
//求小于等于n的全部素数
memset(prime,1,n+1);//初始认为[0:n]之间的整数都为素数
int m=sqrt(n);
prime[0]=prime[1]=0;//0、1是非素数
for(