返回小于M的所有素数

时间:2011-03-18 02:37:58

标签: algorithm primes

给定整数M.返回小于M的所有素数。

尽可能好地提供算法。需要考虑时间和空间的复杂性。

9 个答案:

答案 0 :(得分:18)

Eratosthenes的筛子是一个很好的起点。

http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

答案 1 :(得分:12)

其他一些性能提示:

  1. 您只需要测试M的平方根,因为每个复合数字至少有一个素数因子小于或等于其平方根
  2. 您可以在生成已知素数时对其进行缓存,并仅针对此列表中的数字(而不是sqrt(M)以下的每个数字)测试后续数字。
  3. 您显然可以跳过偶数(当然除了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),如表所示。

enter image description here

它为这个数字格式提供了正确的素数。我希望这会有所帮助。

答案 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