java - 为什么我的算法没有给出预期的输出?

标签 java algorithm arraylist sieve-of-eratosthenes

我正在尝试创建 Sieve of 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 循环结束时,i 已经提前到 2 而没有消除 3 或 5 的倍数(如果你使用更大的 maxNumber)。

关于java - 为什么我的算法没有给出预期的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31167521/

相关文章:

java - 从 ArrayList 中删除项目时出错

python - 年到世纪功能

database - 适用于同步在线和离线数据的方法

Java Tiled map 正在横向绘制

java - java中的数组列表

java - 在 Java 中将一个数组列表复制到另一个数组列表的时间复杂度是多少?

java - 随机访问 Zip 文件而不将其写入磁盘

java - 如何在 Android TO 上强制应用程序图标? (防止发射器采用它)

java - 添加标签的最终 JPanel (java)

java - 我在尝试计算数字是否为回文时出现错误?