簡體   English   中英

Java中的素數

[英]Prime Number in java

我寫了一些代碼來查找不超過給定數字的質數。 你們可以讓我知道使我的代碼更高效或更有效的方法嗎? 或深入了解我的工作方式? 另外,我的代碼中存在一個問題,即某些數字在一個模式中重復兩次或三次。 我該如何解決?

public class PrimeNumber2 {

   public static void main(String[] args)
   {

      int max_prime = 10000;
      for(int i = 3; i < max_prime; i+=2)
      {
         for(int j = 1; j < Math.sqrt(i); j++)
         {
            if(i % j == 0)
            {
                System.out.println(i);
            }
        }

     }

   }    
}

看看: https//en.wikipedia.org/wiki/Sieve_of_Eratosthenes

這是一個很好的方法。

這是一些代碼供您查看:

public void runEratosthenesSieve(int upperBound) {

  int upperBoundSquareRoot = (int) Math.sqrt(upperBound);

  boolean[] isComposite = new boolean[upperBound + 1];

  for (int m = 2; m <= upperBoundSquareRoot; m++) {

        if (!isComposite[m]) {

              System.out.print(m + " ");

              for (int k = m * m; k <= upperBound; k += m)

                    isComposite[k] = true;

        }

  }

  for (int m = upperBoundSquareRoot; m <= upperBound; m++) {

        if (!isComposite[m]) {

              System.out.print(m + " ");

        }

}

這是您的調諧版本。

我確實將檢查數字是否為素數作為單獨的方法。 這也是您的版本多次打印值的部分原因,因為如果發現版本有除數,則它將打印值。 (此外,您的算法將基本打印所有內容,無論它是否為素數,例如打印15和27)。

它確實打印多個值的原因是,一旦找到除數,它就會打印i ,但是它將繼續循環。 如果找到另一個除數,它將再次打印i (您會注意到它不僅打印質數)。

這是您的固定版本

public static void main(String[] args) {
    if(isPrime(2)) {
        System.out.println(2);
    }
    int max_prime = 10000;
    for(int i = 3; i < max_prime; i+=2)
    {
        if(isPrime(i)) {
            System.out.println(i);
        }
    }

}

private static boolean isPrime(int n) {
    if(n<=1) return false;
    if(n == 2) return true;
    for(int i = 2;i*i<=n;++i) {
        if(n%i == 0) return false;
    }
    return true;
}

嘗試這個。

public class PrimeNumber2 {

    public static void main(String[] args) 
    {
        int max_prime = 10000;
        System.out.println(2);
     L: for (int i = 3; i < max_prime; i += 2)
        {
            for (int j = 3, max = (int)Math.sqrt(i); j <= max ; j += 2)
            {
                if(i % j == 0)
                {
                    continue L;
                }
            }
            System.out.println(i);
        }
    }
}

這是使用parallelStream的方法

System.out.println(2);
IntStream.range(1, 10000000)
         .map(i -> i * 2 + 1)
         .filter(i -> (i & 1) != 0 && IntStream.range(1, (int) (Math.sqrt(i)-1)/2)
                                               .map(j -> j * 2 + 1)
                                               .noneMatching(j -> i % j == 0)
         .forEach(System.out::println);

注意:范圍測試第n個奇數。

public static void main(String[] args) {
    int upperBound = 30;
    List<Integer> primes = new ArrayList<>();

    // loop through the numbers one by one
    for (int number = 2; number < upperBound; number++) {
        boolean isPrimeNumber = true;

        // check to see if the number is prime
        for (int j = 2; j < number; j++) {
            if (number % j == 0) {
                isPrimeNumber = false;
                break; // exit the inner for loop
            }
        }

        // print the number if prime
        if (isPrimeNumber) {
            primes.add(number);
        }
    }
    System.out.println("The number of prime is: " + primes.size() + ", and they are: " + primes.toString());
}

在此處輸入圖片說明

可能重復

獲取素數和范圍內的素數總數

public boolean isPrimeNumber(int number) {
    for (int i=2; i<=number/2; i++) {
        if (number % i == 0) {
            return false;
        }
    }
    return true;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM