素数生成器介于2个nums之间

时间:2015-06-07 14:31:08

标签: java algorithm

我无法确定下面提供的代码失败的测试用例。 问题:

此问题的所有提交均可用。

Shridhar希望为他的密码系统生成一些素数。帮助他! 您的任务是生成两个给定数字之间的所有素数。 输入

第一行包含t,测试用例的数量(小于或等于10)。

其后是包含两个数字m和n(1 <= m <= n <= 1000000000,n-m <= 100000)的t行,用空格分隔。 输出

对于每个测试用例,打印所有素数p,使得m <= p <= n, 每行一个数字。用空行分隔每个测试用例的答案。 实施例

Input:
2
1 10
3 5
Output:
2
3
5
7

3
5
import java.util.Scanner;

public class Main implements Runnable {

    public static void main(String args[]) {
        new Main().run();
    }

    @Override
    public void run() {
        Scanner sc = new Scanner(System.in);
        Integer d;
        try {
            d = sc.nextInt();
            boolean isPrime[] = new boolean[100000];
            for (int i = 0; i < d; i++) {
                int m = sc.nextInt();
                int n = sc.nextInt();
                if (n <= 0 || m > n) {
                    continue;
                }
                if (m <= 0) {
                    m = 2;
                    if (m > n) {
                        continue;
                    }
                }
                if (m == 1) {
                    m = 2;
                }
                if (m == 2 && n - m == 0) {
                    System.out.println(2);
                } else {
                    for (int k = 0; k <= n - m; k++) {
                        isPrime[k] = true;
                    }
                    int sqrt = (int) Math.sqrt(n);
                    for (int j = 2; j <= sqrt; j++) {
                        int k = (m % j == 0) ? m / j : (m + j) / j;
                        for (; k <= n / j; k++) {
                            if (!(m == 2 && (j * k == 2)) && k != 1) {
                                isPrime[j * k - m] = false;
                            }
                        }
                    }
                    for (int a = m; a <= n; a++) {
                        if (isPrime[a - m]) {
                            System.out.println(a);
                        }
                    }
                }
                System.out.println();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sc.close();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

你的问题是:

boolean isPrime[] = new boolean[100000];

和此:

for (int k = 0; k <= n - m; k++) {
   isPrime[k] = true;
}

因为某个时间n - m = 100000那么你需要isPrime[100000]你没有分配所以你需要像这样声明isPrime:

boolean isPrime[] = new boolean[100001];