java 孪生素数几种算法

1. 普通方法

public static boolean isPrime1(int x) {
        for (int i = 2; i <= x / 2; i++) {
            if (x % i == 0) { // 能被整除则不为素数
                return false;
            }
        }
        return true;
    }

2. 一般优化方法

public static boolean isPrime2(int n) {
        if (n < 2) {
            return false;
        }
        int k = (int) Math.sqrt(n) + 1;
        for (int i = 2; i < k; ++i) {
            if (0 == n % i) {
                return false;
            }
        }
        return true;
    }
 

3. 六素数法  -- 详见百度百科

数学中,六素数(sexy prime)是相差为 6 的素数偶 (p, p + 6)。例如数 5 和 11 都是素数且差为 6。如果 p + 2 或 p + 4 也是素数,则六素数是素数三元组的一部分
首先解释一下什么叫六素数。六素数的英文为 “sexy prime” ,是相差为6的素数偶( p , p + 6 ),500之下的六素数 有: 
(5,11), (7,13), (11,17), (13,19), (17,23), (23,29), (31,37), (37,43), (41,47), (47,53), (53,59), (61,67), (67,73), (73,79), (83,89), (97,103), (101,107), (103,109), (107,113), (131,137), (151,157), (157,163), (167,173), (173,179), (191,197)

// 第三种方法
    public static boolean isPrime3(int n) {
        if (n <= 3) {
            return n > 1;
        }
        if (n % 2 == 0 || n % 3 == 0) {
            return false;
        }
    
        int k = (int) Math.sqrt(n) + 1;
        for (int i = 5; i < k; i += 6) {
            if (n % i == 0 || n % (i + 2) == 0) {
                return false;
            }
        }
        return true;
    }

整个类方法代码:

import java.util.Scanner;

public class TwinPrimeNumDemo {
    public static void main(String[] args) {
        System.out.println("begin");
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            if (n < 1 || n > 100000001) {
                break;
            }
            long begin = System.currentTimeMillis();
            System.out.println(n + " *1=" + twinPrimeNum(n, 1));
            long end = System.currentTimeMillis();
            System.out.println("1 time = " + (end - begin));

            System.out.println(n + " *2=" + twinPrimeNum(n, 2));
            long end1 = System.currentTimeMillis();
            System.out.println("2 time = " + (end1 - end));

            System.out.println(n + " *3=" + twinPrimeNum(n, 3));
            long end2 = System.currentTimeMillis();
            System.out.println("3 time = " + (end2 - end1));
        }
        sc.close();
        System.out.println("end");
    }

    // 判断相邻的且距离为:2 的两个素数
    public static int twinPrimeNum(int n, int type) {
        int sum = 0;
        // 累加次数
        if (type == 1) {
            for (int i = 2; i < n; i++) // 最小的素数是:2
            {
                if (isPrime1(i) && isPrime1(i + 2))
                    sum++; // 在目标值内寻找孪生素数
            }
        }
        else if (type == 2) {
            for (int i = 2; i < n; i++) // 最小的素数是:2
            {
                if (isPrime2(i) && isPrime2(i + 2))
                    sum++; // 在目标值内寻找孪生素数
            }
        }
        else if (type == 3) {
            for (int i = 2; i < n; i++) // 最小的素数是:2
            {
                if (isPrime3(i) && isPrime3(i + 2))
                    sum++; // 在目标值内寻找孪生素数
            }
        }

        return sum;
        // 返回最后的组数
    }

    // 第一种方法:判断是否是素数
    public static boolean isPrime1(int x) {
        for (int i = 2; i <= x / 2; i++) {
            if (x % i == 0) { // 能被整除则不为素数
                return false;
            }
        }
        return true;
    }

    // 第二种方法

public static boolean isPrime2(int n) {
        if (n < 2) {
            return false;
        }
        int k = (int) Math.sqrt(n) + 1;
        for (int i = 2; i < k; ++i) {
            if (0 == n % i) {
                return false;
            }
        }
        return true;
    }

    // 第三种方法
    public static boolean isPrime3(int n) {
        if (n <= 3) {
            return n > 1;
        }
        if (n % 2 == 0 || n % 3 == 0) {
            return false;
        }
    
        int k = (int) Math.sqrt(n) + 1;
        for (int i = 5; i < k; i += 6) {
            if (n % i == 0 || n % (i + 2) == 0) {
                return false;
            }
        }
        return true;
    }

}

 

输出结果对比:

java 孪生素数几种算法