Java求质数算法

时间:2021-12-15 13:26:15

package com.test_java;

import java.util.Arrays;

public class Prime {

/*
* **求N以内的质数
*/
int N;
int i,j;

Prime(int inputN){
this.N = inputN;
}
//普通试除法
private void comPrime1_1(){
System.out.println("小于" + N + "的质数有:");
for(i=N;i>=0;i--){
for(j=i-1;j>=2;j--){
if(i%j==0){
break;
}
if(j<=2)
System.out.println(i);
}
}
System.out.println(2);
}

//循环到sqrt(N)即可,简单解释一下:因数都是成对出现的。比如,100的因数有:1和100,
//2和50,4和25,5和20,10和10。看出来没有?成对的因数,其中一个必然小于等于100的开
//平方,另一个大于等于100的开平方。
private void comPrime1_2(){
System.out.println("小于" + N + "的质数有:");
for(int i=N;i>=0;i--){
for(int j=2;j<=(int)Math.sqrt(i);j++){
if(i%j==0)
break;
if(j == (int)Math.sqrt(i))
System.out.println(i);
}
}
}

//筛选法
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 comPrime2(){
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){
Prime prime = new Prime(100);
prime.comPrime2();
}
}