蛮力素数检查,用于16位长的整数

时间:2019-03-05 16:07:54

标签: brute-force primality-test

我该如何使用蛮力(天真算法)来检查16位长的整数是否为质数,并在其之前打印所有质数。数字示例:1254786951475276。这是我的代码:

   import java.io.*;

public class PrimeNumbers {

    public static boolean checkPrime(long n)
    {
        if (n % 2 == 0)
            return false;

        for (int i = 3; i <= Math.sqrt(n); i += 2) 
        {
            if (n % i == 0)
                return false;
        }

        return true;
    }

    public static void generatePrimeNumbers(long n) {

        for (int i = 2; i<= n-1 ; i++) {

            if (checkPrime(i)) {
                System.out.println(i);
            }
        }
    }

    public static void main(String args[]) throws Exception{

        BufferedReader br = new BufferedReader (new InputStreamReader(System.in));

        long n = 0;
        n = Integer.parseInt(br.readLine());

        generatePrimeNumbers(n);
    }
    }

1 个答案:

答案 0 :(得分:0)

我猜你的意思是16位,而不是16位。 16位非常简单,您可以通过简单的循环和除法检查它。您的checkPrime()可以这样优化:

public static boolean checkPrime(long n)
{
    if (n == 2)
        return true;

    if (n % 2 == 0)
        return false;

    for (long i = 3; i <= Math.sqrt(n); i += 2) 
    {
        if (n % i == 0)
            return false;
    }

    return true;
}

但是如果数字太大(我认为即使是16位数字,也没有必要),则可以使用Miller-robin primality test。此测试可用于检查非常大数字是否为素数。

如果您需要生成所有素数直到一个特定数字,则可以使用Sieve of Eratosthenes

请记住,int的范围是-2,147,483,6482,147,483,647,因此它不能保留16位数字。您可以使用long,因为它的范围是-9,223,372,036,854,775,8089,223,372,036,854,775,807,因此它可以容纳16位数字。