为什么我的Java超过了时限?

时间:2019-11-15 22:33:20

标签: java

输入

输入以一行(t<=10)中的测试用例数 t 开始。在接下来的 t 行中,有两个数字 m n (1 <= m <= n <= 1000000000, n-m<=100000),用空格隔开。

输出

对于每个测试用例,打印所有素数 p ,这样m <= p <= n(每行一个数字)将测试用例用空行分隔。

示例 输入:

2
1 10
3 5

输出:

2
3
5
7

3
5

正如我宣布的那样。我解决了这个问题,但是我试图上传一个站点的解决方案,但是我超出了时间限制。我没有弄清楚如何进行优化。

有人可以帮忙吗?谢谢。

Scanner s = new Scanner(System.in);
        int t = s.nextInt();
        int flag = 0;
        int arr[][] = new int[t][2];
        for (int i = 0; i < t; i++) {
            for (int j = 0; j < 2; j++) {
                arr[i][j] = s.nextInt();
            }
        }
        for (int a = 0; a < t; a++) {
            for (int b = arr[a][0]; b <= arr[a][1]; b++) {
                if (b < 2) {
                    b = 2;
                }
                for (int c = 2; c < b; c++) {
                    if (b % c == 0) {
                        flag = 1;
                        break;
                    }
                }
                if (flag == 0) {
                    System.out.println(b);
                } else {
                    flag = 0;
                }
            }
        }

1 个答案:

答案 0 :(得分:0)

您的代码看起来不错,但是for存在一个问题(int c = 2; c

最简单的素数检验是试验除法:给定输入数n,请检查从2到√n的任何素数m是否均分n(除法没有余数)。如果n可被任何m整除,则n为合成,否则为质数。

例如,要通过试验除法测试100的素数,请考虑所有100的整数除数:

2、4、5、10、20、25、50 最大因数是100/2 =50。对于所有n都是如此:所有除数均小于或等于n / 2。检查除数,确定其中一些是多余的。除数的列表可以写为:

100 = 2×50 = 4×25 = 5×20 = 10×10 = 20×5 = 25×4 = 50×2 证明了冗余。一旦对除数10进行了测试,即√100,第一个除数就是前一个除数的除数。因此,可以消除大于√n的测试除数。所有偶数大于2的都可以消除,因为如果偶数可以相除,那么2也可以除。

来源维基百科Primalty test

对代码进行少量修改可以将运行时间提高很多倍。

Scanner s = new Scanner(System.in);
    int t = s.nextInt();
    int flag = 0;
    int arr[][] = new int[t][2];
    for (int i = 0; i < t; i++) {
        for (int j = 0; j < 2; j++) {
            arr[i][j] = s.nextInt();
        }
    }
    for (int a = 0; a < t; a++) {
        for (int b = arr[a][0]; b <= arr[a][1]; b++) {
            if (b < 2) {
                b = 2;
            }
            for (int c = 2; c*c <= b; c++) {
                if (b % c == 0) {
                    flag = 1;
                    break;
                }
            }
            if (flag == 0) {
                System.out.println(b);
            } else {
                flag = 0;
            }
        }
    }