一种改进了的求素数前n项和算法,筛选素数法,可以很好的提高求和效率

作者在 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;
}
 
默认分类 | 阅读 1269 次
文章评论,共0条
游客请输入验证码
浏览69229次