问题描述
输入一个自然数n,求小于等于n的素数之和
样例输入
2
样例输出
2
数据规模和约定
测试样例保证 2 <= n <= 2,000,000
数据量比较大,用函数判断肯定超时,用筛法求素数可以大大提高速度,即当i为素数时,给定小于等于n范围内i的倍数全是和数。
#include <iostream>
#include <cstring>
using namespace std;
int isprime[2000001];//用数组盛放每个数是否是素数,-1表示是,0表示不是
int main() {
memset(isprime,-1,sizeof(isprime));//初始化都为-1
int n;
long long sum=0;//一定要用long long
cin>>n;
for(int i=2;i<=n;i++)
if(isprime[i]==-1)
{
sum+=i;
for(int j=2;j*i<=n;j++)//筛法
isprime[i*j]=0;
}
cout<<sum<<endl;
return 0;
}