两个数之间的半素数个数

Number of semi-primes between two numbers

我正在解决一个编码问题,我调整了一些现有代码,以便能够计算出存在多少个半素数,直到并包括一定数量。

但是,我卡在了计算两个数字之间唯一半素数的部分,例如10 和 4,即 4、6、9 和 10,即 4。我的答案只是说 10 有 4 个半素数,4 有 1 个半素数,所以它们之间的子素数是 4-1 =3 .这就是我出错的地方。

代码在这里:

public class SemiPrimeRange {
    public static int[] solution(int N, int[] P, int[] Q) {
        int arrSize = P.length;
        int[] arr = new int[arrSize];

        for (int i = 0; i < arr.length; i++) {
            int n = NoSemiPrimes(Q[i]);
            int m = NoSemiPrimes(P[i]);
            arr[i] = n-m;
        }

        for (int i : arr) {
            System.out.println(i);
        }
        return arr;

    }

    public static int NoSemiPrimes(int large) {
        int n = 0;

        boolean[] primeTop = new boolean[large + 1];
        boolean[] semiprimeTop = new boolean[large + 1];
        for (int i = 2; i <= large; i++) {
            primeTop[i] = true;
        }

        for (int i = 2; i * i <= large; i++) {
            if (primeTop[i]) {
                for (int j = i; i * j <= large; j++) {
                    primeTop[i * j] = false;
                }
            }
        }

        int primes = 0;
        for (int i = 2; i <= large; i++) {
            if (primeTop[i])
                primes++;
        }

        for (int i = 0; i < large; i++) {
            semiprimeTop[i] = false;
        }

        for (int i = 0; i <= large; i++) {
            for (int j = i; j <= large; j++) {
                if (primeTop[j]&&primeTop[i]) {
                    if(i*j<=large){
                        semiprimeTop[j*i] = true;
                    }           
                }
            }
        }

        for (int i = 0; i < semiprimeTop.length; i++) {
            System.out.println(semiprimeTop[i]);
        }

        int semiprimes = 0;
        for (int i = 2; i <= large; i++) {
            if (semiprimeTop[i])
                semiprimes++;
        }

        System.out.println("The number of semiprimes <= " + large + " is " + semiprimes);
        return semiprimes;

    }

    public static void main(String[] args) {
        int[] P = { 1, 4, 16 };
        int[] Q = { 26, 10, 20 };
        int N = 26;
        solution(N, P, Q);
    }

如果你想要 yx 之间的半素数数 (y > x), count(y) - count(x) (count(a)a 和 1) 之间的半素数数 不是正确的公式,因为如果它是半素数,它将省略 x。正确的公式是 count(y) - count(x - 1).

另请注意,您的代码无效,因为它会在 1 和较小的数字之间计数两次。

方法签名应该是

public static int NoSemiPrimes(int small, int large)

并更改循环

int semiprimes = 0;
for (int i = 2; i <= large; i++) {
    if (semiprimeTop[i])
        semiprimes++;
}

int semiprimes = 0;
for (int i = small; i <= large; i++) {
    if (semiprimeTop[i])
        semiprimes++;
}

直接计算所需范围内的半素数,而不是使用两次int NoSemiPrimes(int large)