作者在 2011-11-24 15:24:06 发布以下内容
一种改进了的求素数前n项和算法,筛选素数法,可以很好的提高求和效率
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
bool is_special(vector <int>& sp,int num )//筛选素数
{
if(num==0||num==1) return false;
//if(num==2) return true;
if(num%2==0&&num!=2) return false;
else
{
vector<int> ::iterator it=sp.begin();
for(; *it<=sqrt(num); it++)
{
if(num%*it==0) return false;
}
}
return true;
}
int sum(vector <int> &sp,int n)//求和
{
while(sp.size()<n)
{
//int last=*(sp.end());
int last=sp.back();
int num=last+1;
while(!is_special(sp,num))
{
num++;
}
sp.push_back(num);//扩展素数列表
}
int sum=0;
for (int i=0; i<n; i++)
{
sum=sum+sp[i];
}
return sum;
}
int main(int argc, const char *argv[])
{
vector<int> sp;//创建素数列表;
sp.push_back(2);//将最小素数初始化到素数列表第一位
int n;
cin>>n;
cout<<sum(sp,n)<<endl;
cout<<sp.size();
//cout<<sp.back();
/*while(!sp.empty())
{
cout<<sp.back()<<endl;
sp.pop_back();
}*/
return 0;
}
#include <vector>
#include <cmath>
using namespace std;
bool is_special(vector <int>& sp,int num )//筛选素数
{
if(num==0||num==1) return false;
//if(num==2) return true;
if(num%2==0&&num!=2) return false;
else
{
vector<int> ::iterator it=sp.begin();
for(; *it<=sqrt(num); it++)
{
if(num%*it==0) return false;
}
}
return true;
}
int sum(vector <int> &sp,int n)//求和
{
while(sp.size()<n)
{
//int last=*(sp.end());
int last=sp.back();
int num=last+1;
while(!is_special(sp,num))
{
num++;
}
sp.push_back(num);//扩展素数列表
}
int sum=0;
for (int i=0; i<n; i++)
{
sum=sum+sp[i];
}
return sum;
}
int main(int argc, const char *argv[])
{
vector<int> sp;//创建素数列表;
sp.push_back(2);//将最小素数初始化到素数列表第一位
int n;
cin>>n;
cout<<sum(sp,n)<<endl;
cout<<sp.size();
//cout<<sp.back();
/*while(!sp.empty())
{
cout<<sp.back()<<endl;
sp.pop_back();
}*/
return 0;
}