素数:除了1和它本身没有其他的因数,这样的数称之为素数。
第一种
int i,n;
while(~scanf("%d",&n))
{
for(i=2; i<n; i++)
{
if(n%i==0) break;
if(i==n) printf("YES\n");
else printf("NO\n");
}
}
第二种
采用sqrt(n),这样需要循环sqrt(n)次,比第一种会更加有效率。
int i,n,s;
while(scanf("%d",&n)!=EOF)
{
s=(int)sqrt(n);
for(i=2;i<=s;i++)
if(n%i==0) break;
if(i>s) printf("YES\n");
else printf("NO\n");
}
第三种
int prime(int x)
{
if(x==1||x==2)
return 1;
for(int i=2; i<=sqrt(x); i++)
{
if(x%i==0)
return 0;
}
return 1;
}
1e11内判断是否为素数
long long prime(long long x)
{
if (x<2)
return 0;
for (int i=2;i<=x/i;i++)
if (x%i==0)
return 0;
return 1;
}
第四种:
素数打表
void prime()
{
for(int i=2;i<=n;i++)
{
if(!book[i])
{
p[tot++]=i;
for(int j=i*i;j<=n;j+=i)
{
book[j]=1;
}
}
}
}
第五种:
int f(int x)
{
if(x==1)
return 0;
if(x==2||x==3)
return 1;
if(x%6!=1&&x%6!=5)
return 0;
for(int i=5;i*i<=x;i+=6)
{
if(x%i==0||x%(i+2)==0)
return 0;
}
return 1;
}
第六种:欧拉筛求小于n的素数的个数
int cnt=0;
int vis[1000010];//保证不做素数的倍数
long long prim[1000010];//存素数
void prime(int n)
{
memset(vis,0,sizeof(vis));//初始化标记
memset(prim,0,sizeof(prim));
for(int i=2; i<=n; i++)
{
if(!vis[i])//不是当前找到的素数的倍数
prim[cnt++]=i;//i是素数
for(int j=0; j<cnt&&i*prim[j]<=n; j++)
{
vis[i*prim[j]]=1;//素数的倍数不是素数
if(i%prim[j]==0)
break;
}
}
}