关于素数的简单算法整理

阅读更多
1、梅森尼数
import java.util.ArrayList;

public class text6 {

    /**
     * 梅森尼数(2的N次方减一是素数,N也必须是素数)
     */
    private static ArrayList list = new ArrayList();
    private static ArrayList list1 = new ArrayList();

    public static void main(String[] args) {
        // 求出(2的30次方的所有情况)
        fun();
        fun2();
        System.out.println("2的30次方以内的所有情况:");
        show();
    }

    // 求出1~30所有的素数并存放在list里面
    public static void fun() {
        for (int i = 1; i < 30; i++) {
            if (fun1(i)) {
                list.add(i);
            }
        }
    }

    // 判断数字是否素数
    public static boolean fun1(int k) {
        int i;
        for (i = 2; i < k; i++) {
            if (k % i == 0) {
                return false;
            }
        }
        if (i == k) {
            return true;
        }
        return false;
    }

    // 按照题目要求求出所有的梅森尼数保存在list1中
    public static void fun2() {
        for (int i = 0; i < list.size(); i++) {
            if (fun1((int) (Math.pow(2, list.get(i)) - 1))) {
                list1.add(list.get(i));
            }
        }
    }

    // 按照题目要求打印
    public static void show() {
        for (int i = 0; i < list1.size(); i++) {
            // int sum=(int) (Math.pow(2, list1.get(i))-1);
            System.out.println("2^" + list1.get(i) + "-1="
                    + (int) (Math.pow(2, list1.get(i)) - 1));
        }
    }

}

2、哥德巴赫猜想(任何大于2的偶数都能表示为两个素数之和)

package com.fit.getPingyin;

import java.util.ArrayList;

public class text8 {

    /**
     * 等差素数数列
     */
    private static ArrayList list = new ArrayList();

    public static void main(String[] args) {
        fun();
        System.out.println("100以内所有的等差素数数列:");// 最多只能解决100以内,其他不敢保证,存在问题
        fun2();

    }

    // 求出1~100所有的素数并存放在list里面
    public static void fun() {
        for (int i = 1; i < 100; i++) {
            if (fun1(i)) {
                list.add(i);
            }
        }
    }

    // 判断数字是否素数
    public static boolean fun1(int k) {
        int i;
        for (i = 2; i < k; i++) {
            if (k % i == 0) {
                return false;
            }
        }
        if (i == k) {
            return true;
        }
        return false;
    }

    // 根据条件求出所有的等差素数数列(还需要改进,存在漏洞)
    public static void fun2() {
        for (int i = 0; i < list.size(); i++) {
            for (int j = 0; j < list.size(); j++) {
                for (int k = 2; k < list.size(); k++) {
                    if (list.get(i) - list.get(j) == list.get(j) - list.get(k)
                            && list.get(i) != list.get(j)) {
                        System.out.print(list.get(i) + "," + list.get(j) + ","
                                + list.get(k) + " ");
                        if (list.get(i) - list.get(j) < 0) {
                            System.out.println("公差为:"
                                    + (-(list.get(i) - list.get(j))));
                        } else {
                            System.out.println("公差为:"
                                    + (list.get(i) - list.get(j)));
                        }
                    }
                }
            }
        }
    }
}

3.第100002个素数

public class text1 {

    /**
     * 第100002个素数
     */
    public static void main(String[] args) {
        int arr[] = new int[1500000];
        int n = 1;
        for (int i = 2; i < 1500000; i++) {
            for (int j = i * 2; j < 1500000; j = j + i) {
                arr[j] = 1;
            }
        }
        for (int i = 2; i <= 100002; i++) {
            while (arr[n = n + 2] == 1)
                ;
        }
        System.out.println(n);
    }

}

你可能感兴趣的:(算法,java)