找到给定范围内的所有素数

Dan*_*ook 0 java primes sieve-of-eratosthenes

我正在编写这个Java程序,它找到给定范围之间的所有素数.因为我正在处理非常大的数字,我的代码似乎不够快,并给我一个时间错误.这是我的代码,有谁知道让它更快?谢谢.

import java.util.*;
public class primes2 
{   
    private static Scanner streamReader = new Scanner(System.in);
    public static void main(String[] args)
    {
        int xrange = streamReader.nextInt(); 
        int zrange = streamReader.nextInt();
        for (int checks = xrange; checks <= zrange; checks++)
        {
            boolean[] checkForPrime = Primes(1000000);
            if (checkForPrime[checks])
            {
                System.out.println(checks);
            }
        }
    }
    public static boolean[] Primes(int n)
    {
        boolean[] isPrime = new boolean[n + 1];
        if (n >= 2)
            isPrime[2] = true;
        for (int i = 3; i <= n; i += 2)
            isPrime[i] = true;
        for (int i = 3, end = sqrt(n); i <= end; i += 2)
        {
            if (isPrime[i]) 
            {
                for (int j = i * 3; j <= n; j += i << 1)
                    isPrime[j] = false;
            }
        }
        return isPrime;
    }
    public static int sqrt(int x)
    {
        int y = 0;
        for (int i = 15; i >= 0; i--) 
        {
            y |= 1 << i;
            if (y > 46340 || y * y > x)
                y ^= 1 << i;
        }
        return y;
        }
}
Run Code Online (Sandbox Code Playgroud)

rua*_*akh 7

通过改变这一点,你将获得巨大的进步:

    for (int checks = xrange; checks <= zrange; checks++)
    {
        boolean[] checkForPrime = Primes(1000000);
Run Code Online (Sandbox Code Playgroud)

对此:

    boolean[] checkForPrime = Primes(1000000);
    for (int checks = xrange; checks <= zrange; checks++)
    {
Run Code Online (Sandbox Code Playgroud)

您当前的代码会重新生成筛选zrange - xrange + 1次数,但实际上您只需要生成一次.