Is the size of an array constrained by the upper limit of int (2147483647)?

后端 未结 6 1294
梦谈多话
梦谈多话 2020-12-06 19:06

I\'m doing some Project Euler exercises and I\'ve run into a scenario where I have want arrays which are larger than 2,147,483,647 (the upper limit of

6条回答
  •  遥遥无期
    2020-12-06 19:54

    You don't need an array that large at all.

    When your method runs into resource problems, don't just look at how to expand the resources, look at the method also. :)

    Here's a class that uses a 3 MB buffer to calculate primes using the sieve of Eratosthenes. The class keeps track of how far you have calculated primes, and when the range needs to be expanded it creates a buffer to test another 3 million numbers.

    It keeps the found prime numbers in a list, and when the range is expanded the previos primes are used to rule out numbers in the buffer.

    I did some testing, and a buffer around 3 MB is most efficient.

    public class Primes {
    
       private const int _blockSize = 3000000;
    
       private List _primes;
       private long _next;
    
       public Primes() {
          _primes = new List() { 2, 3, 5, 7, 11, 13, 17, 19 };
          _next = 23;
       }
    
       private void Expand() {
          bool[] sieve = new bool[_blockSize];
          foreach (long prime in _primes) {
             for (long i = ((_next + prime - 1L) / prime) * prime - _next;
                i < _blockSize; i += prime) {
                sieve[i] = true;
             }
          }
          for (int i = 0; i < _blockSize; i++) {
             if (!sieve[i]) {
                _primes.Add(_next);
                for (long j = i + _next; j < _blockSize; j += _next) {
                   sieve[j] = true;
                }
             }
             _next++;
          }
       }
    
       public long this[int index] {
          get {
             if (index < 0) throw new IndexOutOfRangeException();
             while (index >= _primes.Count) {
                Expand();
             }
             return _primes[index];
          }
       }
    
       public bool IsPrime(long number) {
          while (_primes[_primes.Count - 1] < number) {
             Expand();
          }
          return _primes.BinarySearch(number) >= 0;
       }
    
    }
    

提交回复
热议问题