Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说寻找大素数算法_我找到素数规律了,希望能够帮助你!!!。
package primeNumber;
import java.util.Arrays;
 import java.util.Scanner;
/**
  * 本文系作者高中时候与同学讨论的结果生成 结果是依据素数定理推倒而来 依据此公式可以求出无限大的素数 但非公理 次计算结果虽然可以求无限大的素数 但仍需验证
  * 
  */
 public class primeNumber {
 
     public static void main(String[] args) {
 
         // 调用方法输入阶乘范围(long 类型仅支持70以内的阶乘)
         Scanner scan = new Scanner(System.in);
         int num = Integer.parseInt(scan.next());
         int[] primeArray = primes(num);
         // long 类型仅能支持70以内的阶乘
         long p = 1;
         // 阶乘范围内的所有素数
         // i从1开始 因为后面还需加减2的
         for (int i = 1; i < primeArray.length; i++) {
 
             p *= primeArray[i];
         }
         /*
          * 根据素数定理 间隔log e (mun)一定会出现一个素数 且当num的值越大概率随之增大(详询百度百科)
          * 所以p±2^n有非常大概率是素数(n正整数) 并且num数值越大存在的素数越多
          */
         for (int i = 0; i < 20; i++) {
 
             System.out.println(i);
             System.out.println(Math.round(p + Math.pow(2, i)));
             // 分解验证
             getPrimer(Math.round(p + Math.pow(2, i)));
        }
     }
    // 寻找小范围内所有素数
     public static int[] primes(int n) {
 
         if (n < 0) {
 
             throw new IllegalArgumentException(
                     "N must be a non negative integer.");
         }
         if (n <= 1) {
 
             return new int[0];
         }
         int len = ((n & 1) == 1) ? (n >> 1) + 1 : n >> 1;
         boolean[] p = new boolean[len + 1];
         for (int k = 3, limit = (int) Math.sqrt(n); k <= limit; k += 2) {
 
             if (!p[(k + 1) >> 1]) {
 
                 for (int j = (k * k + 1) >> 1; j <= len; j += k) {
 
                     p[j] = true;
                 }
             }
         }
         int primeNums = 0;
         /* 获取精确的素数数量,以免开辟过大的数组造成空间不足的情况。 */
         for (int i = 1; i <= len; i++) {
 
             if (!p[i]) {
 
                 primeNums++;
             }
         }
         int[] primeArray = new int[primeNums];
         primeArray[0] = 2;
         int count = 1;
         for (int i = 2; i <= len; i++) {
 
             if (!p[i]) {
 
                 primeArray[count++] = i * 2 - 1;
             }
         }
         return Arrays.copyOf(primeArray, count);
     }
    // 分解大数的质数因子 验证
     public static void getPrimer(long num) {
 
         for (int i = 2; i <= num; i++) {
 
             if (num % i == 0) {
 
                 System.out.print(i + " ");
                 getPrimer(num / i);
                 break;
             }
             if (i == num) {
 
                 System.out.print(i + "");
             }
         }
     }
 }
  
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章