我在SPOJ上做了一些问题,它被称为素数生成器。
我的代码在我的本地计算机上工作正常但在SPOJ上我遇到超出时间限制的错误。
有人可以告诉我如何使这个程序和类似的程序更有效地运行大量嵌套循环?
import java.util.*;
import java.lang.*;
import java.math.*;
class Main {
public static void main (String[] args) throws java.lang.Exception {
Scanner obj = new Scanner(System.in);
int t = obj.nextInt();
for(int i = 0; i < t; i++) {
int m = obj.nextInt();
int n = obj.nextInt();
for(int x = m; x <= n; x++) {
boolean flag = true;
int count = 0;
for(int j = 2; j < Math.pow(n,0.5) ; j++) {
if(x == 1 || x == 2) {
flag = false;
break;
}
if(x % j == 0 && x != j) {
flag = false;
break;
}
}
if(flag) {
System.out.println(x);
}
}
System.out.println();
}
}
答案 0 :(得分:1)
Math.pow(n,0.5)
都应该很慢,所以应该在每次循环之前调用一次,并且应该保存返回值。sqrt(n)
的素数。答案 1 :(得分:0)
这是一个非常快的简单示例(代码已完成,因此您可以自行测试)。
它通过忽略所有偶数来减少所涉及的循环次数,并通过除以目前为止发现的其他素数来测试数字是否为素数
import java.util.List;
import java.util.ArrayList;
public class PrimeGen
{
public static void main( String[] args )
{
// Max number to search to (hardcoded for example).
int max = 100;
// List of primes discovered so far.
// We'll start it off as [2].
// We testing if a number is prime we just have to test if it's
// divisible by the other primes we have discovered so far.
List<Integer> primes = new ArrayList<Integer>();
primes.add(2);
// Test all odd numbers up to max (evens are not prime).
for( int i = 3; i < max; i = i + 2 )
{
boolean isPrime = true;
for( int j : primes )
{
if( i % j == 0 )
isPrime = false;
break;
}
if( isPrime )
{
primes.add( i );
}
}
// Print results.
for( Integer i : primes )
{
System.out.print( i + ", " );
}
}
}