【发布时间】:2011-05-31 21:43:56
【问题描述】:
质数的生成很简单,但是找到它并递归生成(质数)它的最快方法是什么?
这是我的解决方案。然而,这不是最好的方法。我认为它是 O(N*sqrt(N))。如果我错了,请纠正我。
public static boolean isPrime(int n) {
if (n < 2) {
return false;
} else if (n % 2 == 0 & n != 2) {
return false;
} else {
return isPrime(n, (int) Math.sqrt(n));
}
}
private static boolean isPrime(int n, int i) {
if (i < 2) {
return true;
} else if (n % i == 0) {
return false;
} else {
return isPrime(n, --i);
}
}
public static void generatePrimes(int n){
if(n < 2) {
return ;
} else if(isPrime(n)) {
System.out.println(n);
}
generatePrimes(--n);
}
public static void main(String[] args) {
generatePrimes(200);
}
【问题讨论】:
-
您正在测试素数,而不是生成素数。
-
如果你想生成最多 n 个素数,你可以使用 Eratosthenes 筛。
-
不确定你的面试官是想要最好的睡眠时间,还是只是最好的时间,但你可以通过根本不将偶数发送到函数中来获得局部优化。只需检查 200 是否为偶数,减去 1,然后每次调用 generatePrimes(n-=2)。
-
但这真的不会给你带来太多好处,因为你检查它是否甚至在 isPrime 方法中......但我只是说......你可以做一些持续的时间工作,然后削减您对 generatePrimes 函数的调用减半。
-
这似乎是一个非常愚蠢的面试问题。
标签: java algorithm math primes