题型一:判断一个数n是否为素数
解法:只需将sqrt(n)以内的素数用素数筛求出,让n对这些素数取余,如果存在为0的则为合数,否则为素数。
题型二:判断许多数(最大为n)是否为素数
解法:用n的素数筛。
结论一:若一个数为两质数乘积,则这个数只有这两个因子。
n以内埃氏筛代码如下,
时间复杂度O(n*loglogn):
public static void E(int n) {
notPrime[0]=true;
notPrime[1]=true;
int index=0;
for(int i=2;i*i<=n;i++) {
if(!notPrime[i]) {
prime[index++]=i;
for(int j=i*i;j<=n;j+=i) {
notPrime[j]=true;
}
}
}
}
有一种更简洁的写法,只开一个arr数组,arr[i]存的是i的最小素因子,如果等于0(除了i=0,=1)则i为素数:
public static int arr[]=new int[maxn];
public static void e(int n) {
for(int i=2;i*i<=n;i++) {
if(arr[i]!=0) {
continue;
}else {
for(int j=2;j*i<=n;j++) {
if(arr[i*j]==0) {
arr[i*j]=i;
}
}
}
}
}