一个很经典的面试题,最好你先能自己实现。
import java.util.ArrayList;
import java.util.Date;
public class sushu {
/**
* 素数算法1
*/
static ArrayList<Integer> suan(int n){
ArrayList<Integer> al = new ArrayList<Integer>();
al.add(2);
int max = (int)Math.sqrt(n);
for (int i=3; i<=n; i+=2) {
boolean is = true;
for (Integer su : al) {
if(su > max){
break;
} else if(i%su == 0){
is = false;
break;
}
}
if(is){
al.add(i);
}
}
return al;
}
/**
* 素数算法2
*/
static int[] suan1(int n) {
int len = (int)Math.ceil(n/2.0);
boolean[] al = new boolean[len];
int max = (int)Math.ceil(Math.sqrt(n));
int rs=len,i=0,ii=0,tm=0;
for (i=3; i<=max; i+=2) {
for (ii=i; ii<=n; ii+=2) {
tm = i*ii;
if(tm>n){
break;
}
if(!al[tm>>1]){
rs--;
al[tm>>1] = true;
}
}
}
int[] arr = new int[rs];
int j = 0;
for(i=0;i<len;i++){
if(!al[i]){
arr[j++] = (i<<1)|1;
}
}
arr[0]++;
return arr;
}
public static void main(String[] args) {
int n = Integer.parseInt(args[0]);
long t = new Date().getTime();
ArrayList<Integer> al = sushu.suan(n);
long f = new Date().getTime();
System.out.println("run:"+(f-t)+"ms size:"+al.size());
// for (Integer a : al ) {
// System.out.println(a);
// }
t = new Date().getTime();
int[] al1 = sushu.suan1(n);
f = new Date().getTime();
System.out.println("run:"+(f-t)+"ms size:"+al1.length);
// for (int a : al1 ) {
// System.out.println(a);
// }
}
}