在《计算机的奥秘》第24章“低级语言与高级语言”中介绍了一种求素数的方法:Eratosthenes方法,Eratosthenes是公元前3世纪,古希腊天文学家,数学家,地理学家。
Eratosthenes方法是从以2开始的正的自然数列表开始。因为2是素数,则要删除所有是2的倍数的数(即除2以外的所有偶数),这些数都不是素数。因为3是素数,则要删除所有是3的倍数的数。已经知道4不是素数,因为它已被删除了。下一个素数是5,则要删除所有是5的倍数的数。依此类推,那些余下的数就是素数。
下面的实现是自己的实现
/**
* 获取给定数组的素数
* @param original
* @return
*/
static int[] getPrimeNum(int[] original){
int index = 0;
while(index != Math.sqrt(original.length)){
int prime = original[index];
if(prime != 1){
index++;
}
original = filter(prime,original);
}
return original;
}
/**
* 将素数prime对应的倍数都过滤掉
* @param prime
* @param original
* @return
*/
private static int[] filter(int prime,int[] original) {
ArrayList<Integer> list = new ArrayList<Integer>();
for(int i=0;i<original.length;i++){
if(prime == 1){
if(original[i] != 1){
list.add(original[i]);
}
continue;
}
if(original[i] == prime){
list.add(prime);
continue;
}
if(original[i] % prime != 0 && original[i] != 1){
list.add(original[i]);
}
}
int[] copy = new int[list.size()];
for(int i=0;i<list.size();i++){
copy[i] = list.get(i);
}
return copy;
}
测试:
int[] o = new int[100];
for(int i=0;i<o.length;i++){
o[i] = i+1;
}
int[] original = getPrimeNum(o);
for(int i=0;i<original.length;i++){
System.out.println(original[i]);
}
下面是《计算机的奥秘》上的实现:
boolean[] array = new boolean[100];
int i,j;
for(i=2;i<100;i++){
array[i] = true; //默认所有的都是素数
}
for(i=2;i<10;i++){
if(array[i]){
for(j=2;i*j<100;j++){
array[i*j] = false; //将素数的倍数都置为false
}
}
}
for(i=2;i<100;i++){
if(array[i])
System.out.println(i); //打印结果
}
同样的算法,后者的实现更简便轻巧。