簡體   English   中英

Java函數查找素數不起作用

[英]Java function to find prime number not working

該函數采用整數N.該函數必須打印從2到N的所有素數(包括N,如果N本身是素數)。

我有功能,它運行,但它正在跳過一些素數,甚至包括一些像8這樣的偶數。我似乎無法找到造成這種情況的錯誤。

這是我的代碼的樣子:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class PrimeNumbers {

    List <Integer> primeList = new ArrayList<Integer>();
    public ArrayList<Integer> findPrimes(int n){

        if(n == 2){
            primeList.add(n);
        }
        else{
            //should I have i=i+2 instead of i++ to move faster? 
           //If so, by doing this, it causes weird and different 
          //output when running
            for(int i=2; i<=n; i++){
                if(n%i != 0){
                    primeList.add(i);
                }
            }

        }

        return (ArrayList<Integer>) primeList;
    }

    public static void main(String[] args) {
        PrimeNumbers pn = new PrimeNumbers();

        System.out.println(pn.findPrimes(15));
    }

}

你的邏輯是完全倒退的。 如果你測試了所有可能的除數,你只能說一個數字是素數。 您當前正在添加具有非零余數的任何數字,即BACKWARDS。 非零余數意味着它不是可分割的,這意味着它不是您正在測試的因子的倍數,例如

8 % 3 -> 2
2 != 0 -> true
therefore 8 is prime

您只能在完成循環之后執行.add()調用,並且沒有測試返回true:

is_prime = true; // assume prime
for(i = 2; i <= n; i++) {
     if (n % 2 == 0) { // no remainder, even divisible, therefore NOT primt
         is_prime = false;
         break; // abort the loop, no point in testing more
     }
}

是的,你可以通過在3開始你的測試並且跳過2來提高效率。由於2是唯一的偶數素數,所以任何其他偶數都不可能是素數,因為2是所有偶數的除數。 所以測試3,5,7,9等...

例如

  test if `n` is even and `!= 2` - if so, then it's NOT prime
  run 3,5,7,... loop to test everything else

您找到素數的邏輯是不正確的。

現在,你的代碼所做的是:1。迭代所有N到2的整數。找到N不能除以的任何整數,並將它們添加到列表中。 這與素數無關。

相反,你的代碼應該做類似的事情:1。迭代所有整數,最多N 2.對於每個整數(假設是M),運行一個子循環迭代它下面的所有整數,並檢查是否都沒有整數可以除以M.如果子循環完成而沒有找到M的除法器,則將M添加到列表中 - 它是素數(不能除以1和它本身之外的任何整數)。

用於檢查數字(2或以上)是否為素數的簡單代碼:

public boolean isPrime(int num)
{
    for (int i = 2; i < num; ++i)
    {
        if (num % i == 0)
        {
            return false;
        }
    }

    return true;
}

對此有很多優化,它本身就是一個世界。

你所做的就是找到n不是因素。 如果n % i != 0 ,則通過添加它來測試導致它的每個數是n的因子。

你需要做的是從2迭代到n,對於每個數字,測試它是否是素數。 你需要兩個循環。 我建議創建一個確定素數的方法,我猜你當前的方法是找不到的。 if(isPrime(i))替換if (n % i != 0) if(isPrime(i))

public static boolean isPrime(long n) {
    // eliminate the simple cases
    if (n < 2) {
        return false;
    } else if (n == 2) {
        return true;
    }

    // only test up until the square root of that number
    for (int i = 2; i < Math.pow(n, 0.5) + 1; i++) {
        if (n % i == 0) {
            return false; // found a factor, it's not prime
        }
    }
    return true; // hasn't found a factor and returned false, so it's prime
}

然后在您當前的代碼中:

for(int i=2; i<=n; i++){
    if(n%i != 0){
        primeList.add(i);
    }
}

只需改變if(n%i != 0){ to if(isPrime(i))

所以它會是這樣的:

for(int i=2; i<=n; i++){
    if(isPrime(i)) {
        primeList.add(i);
    }
}

暫無
暫無

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

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