求质数作为学习编程过程中一道经典的题目,相信任何一个程序员/准程序员都遇到过。
随便拉一个程序员/准程序员都能写出以下求质数的代码
import java.util.Scanner;
public class Examination {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
primeNumber(reader.nextInt());
}
public static void primeNumber(int n) {
for (int i=2; i<=n; i++) {
//若i不能被[2,Math.sqrt(i)]中的任一数字整除,则i是质数
int j;
for (j=2; j<=Math.sqrt(i); j++)
if (i%j == 0) break;
if (j>Math.sqrt(i)) System.out.print(i+" ");
}
}
}
前两天发现了一个不走寻常路的求法,对,就是埃拉托斯特尼筛法
要得到自然数n以内的全部素数,必须把不大于sqrt(n)的所有素数的倍数剔除,剩下的就是素数。
给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去…。
import java.util.*;
public class Test {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
int n = reader.nextInt();
int primeNumber[] = getPrimeNumber(n);
for(int i:primeNumber) {
System.out.print(i+" ");
}
}
public static int[] getPrimeNumber(int n) {
//埃拉托斯特尼筛法求小于等于n的质数
boolean form[] = new boolean[n+1];
Arrays.fill(form, true);//置所有数为未去除
//把[2,Math.sqrt(n)]的所有质数的倍数剔除,剩下的就是质数
for(int i=2; i<=Math.sqrt(n); i++) {
if(form[i]) {
for(int j=2*i; j<=n; j+=i) {
form[j] = false;
}
}
}
int count = 0;
for(int i=2; i<=n; i++) {
if(form[i]) count++;
}
int primeNumber[] = new int[count];
int k = 0;
for(int i=2; i<=n; i++) {
if(form[i]) primeNumber[k++] = i;
}
return primeNumber;
}
}