⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 primegenerator.java

📁 著名的uncle Bob的Agile software development的代码
💻 JAVA
字号:
/** * This class Generates prime numbers up to a user specified * maximum.  The algorithm used is the Sieve of Eratosthenes. * Given an array of integers starting at 2: * Find the first uncrossed integer, and cross out all its * multiples.  Repeat until there are no more multiples
 * in the array. */public class PrimeGenerator{  private static boolean[] crossedOut;
  private static int[] result;  public static int[] generatePrimes(int maxValue)  {    if (maxValue < 2)
      return new int[0];
    else    {
      uncrossIntegersUpTo(maxValue);
      crossOutMultiples();
      putUncrossedIntegersIntoResult();
      return result;    }  }

  private static void uncrossIntegersUpTo(int maxValue)  {    crossedOut = new boolean[maxValue + 1];    for (int i = 2; i < crossedOut.length; i++)      crossedOut[i] = false;  }

  private static void crossOutMultiples()
  {
    int limit = determineIterationLimit();
    for (int i = 2; i <= limit; i++)
      if (notCrossed(i))
        crossOutMultiplesOf(i);
  }

  private static int determineIterationLimit()
  {
    // Every multiple in the array has a prime factor that
    // is less than or equal to the root of the array size,
    // so we don't have to cross of multiples of numbers
    // larger than that root.
    double iterationLimit = Math.sqrt(crossedOut.length);
    return (int) iterationLimit;
  }

  private static void crossOutMultiplesOf(int i)
  {
    for (int multiple = 2*i;
         multiple < crossedOut.length;
         multiple += i)
      crossedOut[multiple] = true;
  }
  private static boolean notCrossed(int i)  {    return crossedOut[i] == false;  }

  private static void putUncrossedIntegersIntoResult()
  {
    result = new int[numberOfUncrossedIntegers()];    for (int j = 0, i = 2; i < crossedOut.length; i++)      if (notCrossed(i))        result[j++] = i;
  }

  private static int numberOfUncrossedIntegers()
  {
    int count = 0;
    for (int i = 2; i < crossedOut.length; i++)      if (notCrossed(i))        count++;

    return count;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -