素数:就是我们常说的质数,即只能被1和它自己本身所整除的数(当然都是在自然数的范围内考虑的)。
下面介绍几种求N以内素数的算法。
1.从1-N全部去遍历,当这个数只能满足被1和n整除它就是素数。
public static int[] prime1 (int n){
int [] a = new int[100];
int num = 0;
int j=0;
for(int i=1;i<=n;i++){
for(j=2;j<i;j++){
if(i%j==0){
break;
}
}
if(j==i){
a[num] = i;
num++;
}
}
return a;
}
2.有人发现,根本不用遍历到N-1,只需遍历到N的平方根就能判断这个数是不是素数了。代码就略了,基本和1是一样的。
3.用筛数法求素数
用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。
public static int[] prime2(int n){
//筛选10000以内的素数
//定义arr数组来表示筛选出来的素数
boolean arr[] = new boolean[n];
int [] a = new int[100];
int num = 0;
//arr数组坐标i不是素数的话就令arr[i]=true
for(int k=2;k<n;k++){
if(!arr[k]){
for(int i=2*k;i<n;i+=k){
arr[i] =true;
}
}
}
//把求的素数放入数组a中。
for(int i=1;i<n;i++){
if(!arr[i]){
a[num] = i;
num++;
}
}
return a;
}
4.用6N±1法求素数
任何一个自然数,总可以表示成为如下的形式之一:
6N,6N+1,6N+2,6N+3,6N+4,6N+5 (N=0,1,2,…)
显然,当N≥1时,6N,6N+2,6N+3,6N+4都不是素数,只有形如6N+1和6N+5的自然数有可能是素数。所以,除了2和3之外,所有的素数都可以表示成6N±1的形式(N为自然数)。
根据上述分析,我们可以构造另一面筛子,只对形如6 N±1的自然数进行筛选,这样就可以大大减少筛选的次数,从而进一步提高程序的运行效率和速度。
以下代码需要自然数大于10 。
public static int[] prime3(int n){
int []a = new int[100];
int k=0;
int num = 5;
a[0]=1;a[1]=2;a[2]=3;a[3]=5;a[4]=7;
for(int i=3;i<n;i+=3){
for(int j=0;j<2;j++){
k = 2*(i+j)-1;
if((k<n)&&k%5==0?false:k%7==0?false:true){
a[num] = k;
num++;
}
}
}
return a;
}