我该如何使用蛮力(天真算法)来检查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);
}
}
答案 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,648
至2,147,483,647
,因此它不能保留16位数字。您可以使用long
,因为它的范围是-9,223,372,036,854,775,808
到9,223,372,036,854,775,807
,因此它可以容纳16位数字。