(1)增加布尔型数组
找到一个素数,则其所有倍数均不是素数
#include <stdio.h>
#include <string.h>
#include <math.h>
int prime(int i)
{
int j;
for(j=2;j<=sqrt(i*1.0);j++)
{
if(i%j==0)
return 0;
}
return 1;
}
int main()
{
int n,i;
int num[100000],p[10000];
int t;
memset(num,0,sizeof(num));
memset(p,0,sizeof(p));
t=0;
num[0]=num[1]=1;
for(i=2;i<=100000;i++)
{
if(num[i]==0)
{
if(prime(i)==1)
{
p[t++]=i;
for(int j=2;j*i<=100000;j++)
num[i*j]=1;
}
}
}
for(i=0;i<t;i++)
printf("%d ",p[i]);
return 0;
}
(2)储存素数在数组p中
找到的数不能被小于立方根的素数整除则为素数,,否则为合数
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
int p[10000];
int n,i;
int j;
int num;
while(scanf("%d",&n)!=-1)
{
num=2;
memset(p,0,sizeof(p));
p[0]=2;
p[1]=3;
int flag;
for(i=4;i<=n;i++)
{
flag=0;
double x=sqrt(i*1.0);
for(j=0;p[j]<=x;j++)
{
if(i%p[j]==0)
{
flag=1;
break;
}
}
if(flag==0)
p[num++]=i;
}
for(i=0;i<num;i++)
printf("%d ",p[i]);
}
return 0;
}
(3)欧拉筛法
#include <stdio.h>
#include <string.h>
#include <math.h>
#define maxn 1000005
int num[maxn];
int p[maxn];
int tot;
void prime()
{
int i;
int j;
memset(num,0,sizeof(num));
for(i=2;i<=maxn;i++)
{
if(num[i]==0)
p[tot++]=i;
for(j=0;j<tot,i*p[j]<maxn;j++)
{
num[i*p[j]]=1;
if(i%p[j]==0) //保证每个数都是由最小的素因数筛去
break;
}
}
return ;
}
int main()
{
prime();
int i;
for(i=0;i<100;i++)
printf("%d ",p[i]);
printf("\n");
return 0;
}