0

isPrime()数値が素数かどうかをチェックgetPrimes(int upper)し、upper までのすべての素数を取得します。sievePrimeFactorSets各数値のすべての素因数 (繰り返しなし) の HashSet を作成し、その HashSet を指定された値 (たとえば HashSet at ) に格納したいと考えていprimeFactors.get(20) = [2,5]ます。

現在、すべての素数すべての値に追加しているので、primeFactors.get(20) = [2,3,5,7,11,13,etc]. なぜこうなった?

public ArrayList<HashSet<Integer>> sievePrimeFactorSets(int upper)
{
    ArrayList<HashSet<Integer>> primeFactors = new ArrayList<HashSet<Integer>>();
    HashSet<Integer> empty = new HashSet<Integer>();
    for (int i = 0; i <= upper; i++)
    {
        primeFactors.add(empty);
    }
    ArrayList<Integer> primes = getPrimes(upper);
    for (Integer p : primes)
    {
        for (int j = p; j <= upper; j+=p)
        {
            primeFactors.get(j).add(p);
        }
    }
    return primeFactors;
}

public ArrayList<Integer> getPrimes (int upper)
{
    ArrayList<Integer> primes = new ArrayList<Integer>();
    primes.add(2);
    for (int i = 3; i <= upper; i++)
    {
        if (isPrime(i))
        {
            primes.add(i);
        }
    }
    return primes;
}
4

1 に答える 1

3

この行:

primeFactors.add(empty);

配列の各要素に同じ空のハッシュ セットを追加します。したがって、すべての要素は同じハッシュ セットを共有し、1 つの要素に対して行っていると思われる変更は、実際にはすべての要素に対して行われます。

次のものに置き換えるだけです:

primeFactors.add(new HashSet<>());
于 2015-07-21T15:37:17.463 に答える