Java—— 求质数(埃拉托色尼的素数筛法 等多种方法)

package com.zth;
/**
 * 求小于 x 的所有质数
 * @author 时光·漫步
 *
 */
public class ZhiShu {
  // 方法一:遍历
  public static int  fun1(int x) {
    if(x<2) {
      return 0;
    }
    if(x == 2) {
      return 1;
    }
    for(int i = 2;i< x;i++) {
      if(x%i == 0) {
        return 0;
      }
    }
     return 1;
  }

  
  //x 如果有(除了自身以外的)质因数,则小于等于 x/2
  public static int  fun2(int x) {
    if(x<2) {
      return 0;
    }
    if(x == 2) {
      return 1;
    }
    for(int i = 2;i<= x/2;i++) {
      if(x%i == 0) {
        return 0;
      }
    }
     return 1;
  }
  
  //除了0和2以外的偶数都不是素数
  public static int  fun3(int x) {
    if(x == 2) {
      return 1;
    }
    if(x<2 || x%2==0 )
      return 0;
    
    for(int i = 3;i<= x/2;i += 2) {
      if(x%i == 0) {
        return 0;
      }
    }
     return 1;
  }
  
    //对于一个小于n的整数X,如果n不能整除X,则n必定不能整除n/X。反之相同

    //一个明显的优化,就是只要从2枚举到√n 即可。

    // 因为在判断2的同时也判断了n/2。到√n时就把2到n-1都判断过了。
  
  public static int  fun4(int x) {
    if(x == 2) {
      return 1;
    }
    if(x<2 || x%2==0 )
      return 0;
    double  n = Math.sqrt(x);
    for(int i = 3;i<= n;i += 2) {
      if(x%i == 0) {
        return 0;
      }
    }
     return 1;
  }
  
  //埃拉托色尼的素数筛法
  public static void   fun5(int x) {
    
    boolean[] arr = new boolean[x+1];
    // 初始化数组为 true
    for(int i = 0 ;i<arr.length;i++) {
      arr[i] = true;
    }
    
    for (int k = 2; k <= x / k; k++) {
      if (arr[k]) {
        for (int i = k; i <= x / k; i++) {
          arr[k * i] = false; // k * i is not prime
        }
      }
    }
    
    for (int i = 2; i < arr.length; i++) {
      if (arr[i]) {
          System.out.printf( i + " ");          
      }
    }
  }
  
  public static void main(String[] args) {
    
    int num = 100;
    // 调用方法一
    System.out.println("方法一结果:");
    for(int i = 2;i<=num;i++) {
      if(fun1(i) == 1)      System.out.print(i + " ");
    }
    
    System.out.println("\n");
    // 调用方法二
    System.out.println("方法二结果:");
    for(int i = 2;i<=num;i++) {
      if(fun2(i) == 1)      System.out.print(i + " ");
    }
    
    System.out.println("\n");
    System.out.println("方法三结果:");
    for(int i = 2;i<=num;i++) {
      if(fun3(i) == 1)      System.out.print(i + " ");
    }
    
    System.out.println("\n");
    System.out.println("方法四结果:");
    for(int i = 2;i<=num;i++) {
      if(fun4(i) == 1)      System.out.print(i + " ");
    }
    
    System.out.println("\n");
    System.out.println("方法五结果:");
    fun5(num);

  }

}

执行结果:

方法一结果:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 

方法二结果:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 

方法三结果:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 

方法四结果:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 

方法五结果:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 

猜你喜欢

转载自blog.csdn.net/qq_41573234/article/details/83097898