【问题标题】:Sieve of Eratosthenes (min and max)埃拉托色尼筛(最小和最大)
【发布时间】:2018-01-16 16:36:01
【问题描述】:

我正在使用Sieve of Eratosthenes 算法来查找某个范围内的素数(从最小值到最大值)。但是,如果我包含最小值,我似乎无法让它工作。

这是我的 Java 代码:

  protected static List<Integer> getSievePrimes(int a, int b) {
    List<Integer> primeNumbers = new ArrayList();

    boolean [] isComposite = new boolean [b + 1];
    isComposite[1] = true;

    // Mark all composite numbers
    for (int i = 2; i <= b; i++) {
//    for (int i = a == 1 ? 2 : a; i <= b; i++) {
        if (!isComposite[i]) {
            // 'i' is a prime number
            //if (i >= a) {
                primeNumbers.add(i);
            //}
            int multiple = 2;
            while (i * multiple <= b) {
                isComposite [i * multiple] = true;
                multiple++;
            }
        }
    }

    return primeNumbers;
  }

如您所见,它目前仅适用于最大值 (b),而不是最小值 (a)。

问题

如何修改上述方法以同时满足最小值和最大值?

【问题讨论】:

  • 看我的回答here
  • 您会在primeNumbers 中找到第一个索引i,这样primeNumbers[i] &gt;= a,然后使用Arrays.copyOf() 之类的东西返回子数组primeNumbers[i]...primeNumbers[primeNumbers.length-1]。或者您可以禁止添加素数,除非它 >= `a'。
  • 从最小值开始会导致误报。例如 min 1000 和 max 1003 会将 1000、1001、1002 和 1003 识别为素数。

标签: java primes sieve-of-eratosthenes


【解决方案1】:
public boolean isPrime( int test ) 
{

  int k;

  if( test < 2 )
    return false;
  else if( test == 2 )  
    return true;
  else if( ( test > 2 ) && ( test % 2 == 0 ) )
    return false;
  else
  {
    for( k = 3; k < ( test/2 ); k += 2 )
    {
        if( test % k == 0 ) 
            return false;
    }
  }

  return true;
}

public void sieveOfEratosthenes( int first, int last )
{
  boolean[ ] sieve = new boolean[ ( last - first ) + 1 ];

  int count = 0;
  int index = 0;

  int cursor = first;
  int end = last;

  while( cursor <= end )
  {
     if( isPrime( cursor ) != sieve[ index ] )
     {
        System.out.println( cursor+" " );
        count++;
     }

     cursor++;
     index++;
  }

  cursor = first;

  if( count == 0 )
     System.out.println( "There are "+count+" primes from "+cursor+" to "+end+"." );
  else if( count == 1 )
     System.out.println( "is the "+count+" prime from "+cursor+" to "+end+"." );
  else
     System.out.println( "are the "+count+" primes from "+cursor+" to "+end+"." );
}

【讨论】:

  • 为了便于阅读,除了 sieveOf Eratosthenes(x, y) 方法之外,我还实现了我的 isPrime(i) 方法。结果,两者都很简洁,更不用说它们都按预期工作。干杯!
猜你喜欢
  • 2011-12-16
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多