#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define PressEnter \
{\
fflush(stdin); /*fflush()清空输入缓冲区的函数*/\
printf("Press Enter...");\
getchar();\
fflush(stdin);\
}
int prime(unsigned int N,unsigned long long int* sum)
{
unsigned int i,j,k,count=0;
if(N>100000000)
i=17;
else if(N>70000)
i=10;
else if(N>10000)
i=5;
else if(N>=100)
i=4;
else if(N>=2)
i=1;
else
return 0;
int* Prime=(int*)malloc(N/i*sizeof(int));
char* flag=(char*)malloc(N+1);
for(flag[0]=-1,i=1;i<=N;i++)
flag[i]=0;//flag[0]空着不用。剩下默认全为0,代表全是质数。
for(i=2;i<=N;i++)
{
if(!flag[i])
{
Prime[count++]=i;
*sum+=i;
}
for(j=0; j<=count && i<=N>>1 && (k=i*Prime[j])<=N; j++)
{
flag[k]=1;//把k=i*Prime[j]标记为合数
if(0==i%Prime[j])break;
}
}
free(Prime);free(flag);
return count;
} //int prime
int main(int argc,char* argv[])
{
unsigned int N=1000000000;
unsigned long long int sum=0;
clock_t before,after;
printf("别动,请耐性等待程序执行...\n");
before=clock();
unsigned int num=prime(N,&sum);
after=clock();
printf("%d 以内有 %d 个质数。质数之和为%llu。\n欧拉筛选计算用时 %d 毫秒。\n",N,num,sum,after-before);
PressEnter;
return 0;
} //int main
欧拉质数筛选法
最新推荐文章于 2023-09-18 16:28:37 发布