200万以内素数求和


这是刚开始写的代码,有点长。

#include <stdio.h>
#include <math.h>
/*
200万以内素数求和
*/
int main()
{
int i;
long long int p=0;
int n,num,s,tmp=0;
scanf ("%d",&n);
for (num=0;num<=n;num++)
{
if(num ==2|| num==3 )//对2||3特殊处理
{
p+=num;
continue;}
{
if(num %6!= 1&&num %6!= 5)//如果是素数,必然在6的旁边
continue;
tmp=sqrt( num);
for(i=2;i <=tmp; i++ )//在6的旁边也不一定是素数,再次进行判断
{s=0;
if(num %i== 0)
{
s=1;
break;
}
}
if (s==0) //实现累加
p+=num;
}
}
printf ("%lld",p);
return 0;
}


最后看到了网上一个代码,效率极高

然后敲了一遍


#include <stdio.h>
/*
2000万内素数求和
*/
int a[20000001]={0};//定义一个20000001的容器
int main()
{
int i,j,n;
long long p=0;
scanf ("%d",&n);
for (i=2;i*i<=n;i++)//从2开始,对其倍数标记
{
if (a[i]==1)
continue;
for (j=i*i;j<=n;j+=i)//进行标记
a[j]=1;
}

for (i=2;i<=n;i++)
if (a[i]==0)//未标记的即为素数
p+=i;
printf ("%lld",p);
return 0;

}