Return all prime numbers smaller than M

后端 未结 9 2088
梦谈多话
梦谈多话 2021-01-02 14:46

Given an integer M. return all prime numbers smaller than M.

Give a algorithm as good as you can. Need to consider time and space complexity.

相关标签:
9条回答
  • 2021-01-02 15:30

    Sieve of Eratosthenes is good.

    0 讨论(0)
  • 2021-01-02 15:31

    The Sieve of Eratosthenes is a good place to start.

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

    0 讨论(0)
  • 2021-01-02 15:31

    The usual answer is to implement the Sieve of Eratosthenes, but this is really only a solution for finding the list of all prime numbers smaller than N. If you want primality tests for specific numbers, there are better choices for large numbers.

    0 讨论(0)
  • 2021-01-02 15:37

    π(n) count the primes less than or equal to n. Pafnuty Chebyshev has shown that if

    limn→∞ π(n)/(n/ln(n))

    exists, it is 1. There are a lot of values that are approximately equal to π(n) actually, as shown in the table.

    enter image description here

    It gives right number of prime number for this number format.I hope this will be helpful.

    0 讨论(0)
  • 2021-01-02 15:41

    A couple of additional performance hints:

    1. You only need to test up to the square root of M, since every composite number has at least one prime factor less than or equal to its square root
    2. You can cache known primes as you generate them and test subsequent numbers against only the numbers in this list (instead of every number below sqrt(M))
    3. You can obviously skip even numbers (except for 2, of course)
    0 讨论(0)
  • 2021-01-02 15:44

    This is what I developed for Seive of Eratosthenes. There would be better implementations,of course.

    //finds number of prime numbers less than length

    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;
    }
    
    0 讨论(0)
提交回复
热议问题