簡體   English   中英

如何在Java中使用ArrayList查找素數

[英]How to find prime numbers by using an ArrayList in java

我當時在用Java進行編碼,因此我陷入了為查找質數而實現的代碼中。

public class PrimeList {

    ArrayList<Integer> list;

    public PrimeList(int n){

        list = new ArrayList<Integer>();

        preparePrimeList(n);
    }

    private void preparePrimeList(int n){
        int c =0;
        for (int i=0; i<=n; i++) {

            if (i%2!=0 && i%3!=0 && i%5!=0 && i%7!=0) {
                list.add(i);
                c++;
            }
        }

        list.remove(0);
        list.remove(1);
    }
    public void printPrimeList(){
        System.out.println(list);
    }
    public boolean isPrime(int nbr){

            if (list.contains(nbr)) {
                return true;
        }
        return false;
    }


    public static void main(String[] args) {

        PrimeList primes = new PrimeList(100);
        primes.printPrimeList();
        primes.isPrime(33);

    }

}

運行代碼時,我得到以下信息:

[11, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

為什么我輸出錯誤? 輸出應該是這樣的:

2, 3, 4, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79,
83, 89, 97
false

我做錯了什么?

謝謝

問題是i%2!=0 && i%3!=0 && i%5!=0 && i%7!=0消除了丟失的數字,即2,3,5,7,因為不滿足它。

另外,您將刪除列表的前兩個數字以說明這種情況,即1和13。(刪除1后11變為索引0)。

但是,如果您的代碼最多只能使用120個。之后,非質數開始出現在序列中。 要計算直至n所有素數,您應該查看Eratosthene的篩

這是因為2, 3, 4, 5, 7不符合您的條件2 % 2 == 03 % 3 == 0等等。 您可以將條件更改為如下所示:

if ((i%2!=0 && i%3!=0 && i%5!=0 && i%7!=0) || i == 2 || i == 3 || i == 5 || i == 7){
    ....
} 

從列表中刪除的問題:

    list.remove(0);
    list.remove(1);

所以您在這里要做的就是刪除第一個元素1,然后刪除第三個元素,在刪除第一個元素13后成為第二個元素

Java8版本:

System.out.println(Integer.toString(2));
IntStream.iterate(3, i -> i + 2)
         .filter(potential -> IntStream.rangeClosed(3, (int)(Math.sqrt(potential)))
                                       .allMatch(n -> potential % n != 0))
         .forEach(prime -> System.out.println(Integer.toString(prime)));

您的代碼完全按照您的要求執行。 它從11開始的原因是您的主要檢查存在缺陷。 例如,2%2 == 0,因此程序認為2不是素數。 同樣對於3、5和7。因此程序從11開始。

您可以通過編寫更准確的素數檢查方法來避免這種情況,而不是只用2、3、5或7檢查可除性的方法。例如:

public boolean checkIfPrime(int num){
   for (int x = 2; x < (int)Math.sqrt(num); x++)
      if (num % x == 0)
          return false;
   return true;
}

另外,在嘗試從列表中刪除第一項時,實際上刪除了第一和第三項(因為第三位置2移到了第二位置1)。 那就是為什么在您的程序中刪除了13。

將list.remove(1)替換為list.remove(0)(因此有兩個)。

希望這可以幫助!

試試這個

ArrayList <Integer> Primes= new ArrayList<>(0); 
Integer count=0;
Integer value=0;
Integer numberOfPrimes=100;
do {
    if(isPrime(value,Primes)) {
    Primes.add(value);
    count++;
}
value++;
}while(count<numberOfPrimes);
System.out.println(Primes.toString());

static boolean isPrime(Integer value, ArrayList <Integer> Primes) {     
if(value==0) {
    return false;
}       
for(int i=0;i<Primes.size() && Primes.get(i)< Math.sqrt(value);i++) {                   
    if(value%Primes.get(i)==0 && Primes.get(i)!=1) {
        return false;
    }           
}       
return true;            
}
import java.util.Arrays;
import java.util.List;

public class PrimeTest {

    public static void main(String[] args) {

        List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9);

        for(Integer num: numbers){

            if(isprime(num,numbers.size())){
                System.out.println(num);
            }
        }
    }

    private static boolean isprime(int n,int length) {

        for(int i=2; i<=length && i<=n ;i++){

            if(i<n && String.valueOf((float)n/(float)i).endsWith("0")){
                return false;
            }else if (n==i && n%i==0){
                return true;
            }
        }
        return false;
    }
}

暫無
暫無

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

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