1.素数定义
只能被1和它自己整除的自然数称为素数,特别规定1不属于素数。
2.素数的判断方法
(1)根据素数的定义,很明显,如果一个数是素数 <==>它的因子只包含1和它本身。
因此可以根据判别某个数的因子的方法来判断其是否是素数。
public class Prime { public static void main(String[] args) { int n=0; System.out.println("以下是1~100自然数中依次出现的指数:"); for(int i=2;i<=100;i++){ if(isPrime(i)){ n++; System.out.print(i+"\t"); if(n%10==0){ System.out.println(); } } } System.out.println(); System.out.println("1~100自然数中质数的个数为:"+n); } private static boolean isPrime(Integer num){ for(int i=2;i<=Math.sqrt(num);i++){ if(num%i==0){ return false; } } return true; } }
注:上面的做法是基本的做法。也可说:以时间换空间。
(2)但是如果要求求出1000000以内的所有素数,上面的方法效率就很低,因此通常采用筛选法去求素数。
筛选法:对于一个数n,如果是素数,那么2*n,3*n,4*n,必定不是素数。
import java.util.Arrays; public class FilterPrime { /* * **求N以内的质数 */ Integer N; FilterPrime(int inputN){ this.N = inputN; } //筛选法 private boolean[] filterNumber(int num){ if(num<=0){ System.out.println("范围必须大于0"); return null; } boolean[] isPrime = new boolean[num + 1]; isPrime[1] = false; Arrays.fill(isPrime,2,num,true); int n = (int)Math.sqrt(num); for(int i=1;i<n;i++){ if(isPrime[i]){ for(int j=2*i;j<=num;j+=i){ isPrime[j]= false; } } } return isPrime; } private void getResult(){ boolean[] primes= filterNumber(N); int num=0; if(primes!=null){ for(int i=1;i<primes.length;i++){ if(primes[i]){ System.out.println(i+" "); if(++num%10==0) System.out.println(); } } System.out.println(); } System.out.println("一共有"+num+"个质数"); } public static void main(String[] argc){ FilterPrime prime = new FilterPrime(100000); prime.getResult(); } }
注:上面是以 空间换时间的做法。