给定整数M.返回小于M的所有素数。
尽可能好地提供算法。需要考虑时间和空间的复杂性。
答案 0 :(得分:18)
Eratosthenes的筛子是一个很好的起点。
答案 1 :(得分:12)
其他一些性能提示:
M
的平方根,因为每个复合数字至少有一个素数因子小于或等于其平方根sqrt(M)
以下的每个数字)测试后续数字。2
)答案 2 :(得分:2)
Eratosthenes的筛子很好。
答案 3 :(得分:2)
usual answer是实现Sieve of Eratosthenes,但这实际上只是查找小于N的所有素数列表的解决方案。如果您想要primality tests来获取特定数字,对于大数字有更好的选择。
答案 4 :(得分:1)
π(n)计算小于或等于n的素数。 Pafnuty Chebyshev表明,如果
lim n→∞π(n)/(n / ln(n))
存在,它是1.实际上有很多值大约等于π(n),如表所示。
它为这个数字格式提供了正确的素数。我希望这会有所帮助。
答案 5 :(得分:0)
我是c#的新手程序员(并且是S.O.的新手),所以这可能有点冗长。尽管如此,我已经对此进行了测试,而且我的工作正在进行中。
这就是我想出来的:
for (int i = 2; i <= n; i++)
{
while (n % i == 0)
{
Console.WriteLine(i.ToString());
n /= i;
}
}
Console.ReadLine();
答案 6 :(得分:0)
您可以使用名为Sieve of Eratosthenes的自下而上的动态编程方法来实现 基本上,您创建一个所有数字最多为n的布尔缓存,并将每个数字的倍数标记为not_prime。 通过仅检查最多sqrt(n)可以获得进一步的优化,因为任何复合数将至少有一个除数小于sqrt(n)
public int countPrimes(int n) {
if(n==0){
return 0;
}else{
boolean[] isPrime=new boolean[n];
for(int i=2;i<n;i++){
isPrime[i]=true;
}
/* Using i*i<n instead of i<Math.sqrt(n)
to avoid the exepnsive sqrt operation */
for(int i=2;i*i<n;i++){
if(!isPrime[i]){
continue;
}
for(int j=i*i;j<n;j+=i){
isPrime[j]=false;
}
}
int counter=0;
for(int i=2;i<n;i++){
if(isPrime[i]){
counter++;
}
}
return counter;
}
}
答案 7 :(得分:0)
这是我为Serat of Eratosthenes开发的。当然会有更好的实现。
//找到小于长度的素数数
private static int findNumberOfPrimes(int length) {
int numberOfPrimes = 1;
if (length == 2) {
return 1;
}
int[] arr = new int[length];
//creating an array of numbers less than 'length'
for (int i = 0; i < arr.length; i++) {
arr[i] = i + 1;
}
//starting with first prime number 2, all the numbers divisible by 2(and upcoming) is replaced with -1
for (int i = 2; i < arr.length && arr[i] != -1; i++) {
for (int j = i; j < arr.length; j++) {
if (arr[j] % arr[i] == 0) {
arr[j] = -1;
numberOfPrimes += 1;
}
}
}
return numberOfPrimes;
}
答案 8 :(得分:0)
Atkin的Sieve也是在这种情况下实现的最佳算法,它只需要O(N)操作和O(N)空间。有关算法和伪代码的详细说明,请参阅https://en.wikipedia.org/wiki/Sieve_of_Atkin。