[英]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.