繁体   English   中英

为什么我在 Java 中超过了时间限制?

[英]Why I am getting Time Limit Exceeded in Java?

输入

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

Output

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

示例输入:

2
1 10
3 5

Output:

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;
                }
            }
        }

您的代码看起来不错,但在 for (int c = 2; c < b; c++) 处有一个问题。

最简单的素数测试是试除法:给定一个输入数 n,检查从 2 到 √n 的任意素数 integer m 是否均分 n(除法不留余数)。 如果 n 可以被任何 m 整除,则 n 是合数,否则,它是素数。

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

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 也可以。

来源 Wikipedia Primalty 测试

因此,对您的代码进行小的修改可以将运行时间提高很多倍。

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;
            }
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM