簡體   English   中英

為什么我的算法沒有給出預期的輸出?

[英]Why is my algorithm not giving the expected output?

我正在嘗試創建Eratosthenes算法篩網的Java實現。

我有下面的代碼,盡管給出了錯誤的輸出,但仍可以運行。

import java.util.ArrayList;
public class sieveOfEratosthenes {
    private static final ArrayList<Integer> test = new ArrayList<>();
    public static void main (String [] args) {
        java.util.Scanner tempInput = new java.util.Scanner(System.in);
        System.out.println("What number would you like the prime numbers to be generated to?");
        int maxPrime = tempInput.nextInt();
        for(int i = 2; i <= maxPrime; i++) {
            test.add(i);
        }
        getPrimeList(maxPrime);
    }

    private static void getPrimeList(int maxNumber) {
        int sqrtOfNum = (int) Math.sqrt(maxNumber);
        int temp = 0, i = 0;
        int currentPrime = test.get(i);
        boolean completed = false;
        i++;
        //do {
        while((completed == false) && (i < test.size())) {
            if(i >= test.size()) {
                completed = true;
            } else if((temp <= sqrtOfNum) ) {
                removeMultiples(currentPrime);
            }
            i++;
            if (i < test.size()) {
                currentPrime = test.get(i);
            }
        }
        //}while(completed == false && (i < test.size()));
        System.out.println("Prime numbers upto: " + maxNumber + ": " + test);
    }

    private static void removeMultiples(int primeToTest) {
        ArrayList<Integer> temp = new ArrayList<>();
        for (Integer toTest : test) {
            if (!(((toTest) % primeToTest) == 0)) {
                temp.add(toTest);
            }
        }
        test.clear();
        test.addAll(temp);
    }
}

該程序給出的輸出示例如下:

What number would you like the prime numbers to be generated to?
10
Prime numbers upto: 10: [3, 5, 9]

顯然,以上示例的輸出應為:

Prime numbers upto: 10: [2, 3, 5, 7]

您將test初始化為[2,3,4,5...] ,將currentPrime設置為2( test[0] ),刪除其倍數(刪除2)。 我相信當i成為2且test[2] = 7時也會發生類似的情況。

在3和5上不會發生這種情況,因為您正在使用i進行test ,但同時也從test刪除項目,以便i引用的值發生更改(因為該位置的值已更改)。 因此,在第一次通過while循環結束whilei已經提高到了2,而從未消除3或5的倍數(如果使用更大的maxNumber ,您會看到的)。

Eratosthenes的Sieve算法說,當您考慮一個質數currentPrime您必須將其所有倍數(除自身以外)標記為非質數。 removeMultiples函數中,您還將同時刪除currentPrime

getPrimeList進行迭代的方式對我來說也有些奇怪。 我認為您可能會i >= test.size() completed變量和某些i >= test.size()測試。 嘗試類似的方法:

import java.util.ArrayList;
public class sieveOfEratosthenes {
    private static final ArrayList<Integer> test = new ArrayList<>();
    public static void main (String [] args) {
        java.util.Scanner tempInput = new java.util.Scanner(System.in);
        System.out.println("What number would you like the prime numbers to be generated to?");
        int maxPrime = tempInput.nextInt();
        for(int i = 2; i <= maxPrime; i++) {
            test.add(i);
        }
        getPrimeList(maxPrime);
    }

    private static void getPrimeList(int maxNumber) {
        int sqrtOfNum = (int) Math.sqrt(maxNumber);
        int temp = 0, i = 0, current_prime = 0;
        //do {
        while(current_prime <= sqrtOfNum && i < test.size()) {
            current_prime = test.get(i);            
            removeMultiples(current_prime);
            i++;
        }
        //}while(completed == false && (i < test.size()));
        System.out.println("Prime numbers upto: " + maxNumber + ": " + test);
    }

    private static void removeMultiples(int primeToTest) {
        ArrayList<Integer> temp = new ArrayList<>();
        tmp.add(primeToTest);
        for (Integer toTest : test) {
            if (toTest%primeToTest != 0) {
                temp.add(toTest);
            }
        }
        test.clear();
        test.addAll(temp);
    }
}

暫無
暫無

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

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