素数求和

来源:互联网 发布:淘宝潮牌 编辑:程序博客网 时间:2024/06/08 03:14

                                          算法提高 素数求和


                                                                                          时间限制: 1 Sec  内存限制: 256 MB


题目描述


输入一个自然数n,求小于等于n的素数之和

输入


2


输出


2

样例输入


2

样例输出


2

提示


数据规模和约定



测试样例保证 2 <= n <= 2,000,000

来源

思路:这里有两种解法,第一种就是较为常用的,时间复杂度高。第二种是用了筛法求素数,筛法其实就是以空间换时间的一个最好的证明。空间复杂度增加了,时间复杂度降低了。这和斐波那契数列求解类似,如果用递归,那么时间复杂度很慢,如果将用数组存储一个斐波那契数列,则时间复杂度降低到线性。
第一种解法:
#include<stdio.h>#include<iostream>#include<string.h>#include<math.h>using namespace std;int prime(int n){    int i;    if(n==0||n==1)        return -1;    if(n==2||n==3)        return 1;    for(i=2;i*i<=n;i++)//因为这个地方处理不当错过几次        if(n%i==0)            break;    if(i>sqrt(n))        return 1;    return -1;}int main(){    int n,i;    long long int s=0;    cin>>n;    for(i=2;i<=n;i++)        if(prime(i)==1)        s+=i;    //cout<<s<<endl;    printf("%lld\n",s);    return 0;}
第二种解法:(筛法求素数)
#include<iostream>#include<string.h>#include<math.h>using namespace std;int a[2000000]={0};int main(){    int n,i,j;    cin>>n;    for(i=2;i<=2000000;i++)    {        if(a[i]==1) continue;        else        {            for(j=i+i;j<=2000000;j+=i)            { if(j%i==0) a[j]=1;}        }    }    long long int sum=0;    for(i=2;i<=n;i++)    {        if(a[i]==0)        {            sum+=i;        }    }    cout<<sum<<endl;    return 0;}





0 0
原创粉丝点击