输入
输入以一行(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;
}
}
}
答案 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;
}
}
}