1

数値の素因数を返す関数がありますが、int 配列を初期化するときにサイズを設定します。したがって、結果は不要なゼロで構成されます。ゼロなしで結果配列を返すにはどうすればよいですか、または配列の適用可能なサイズを初期化するにはどうすればよいですか? リストを使用していません

public static int[] encodeNumber(int n){
        int i;
        int j = 0;
        int[] prime_factors = new int[j];
        if(n <= 1) return null;
        for(i = 2; i <= n; i++){
            if(n % i == 0){
                n /= i;
                prime_factors[j] = i;
                i--;
                j++;
            }
        }
        return prime_factors;
    }

ありがとう!!!

4

2 に答える 2

2

これは、私が最近取り組んだ素因数問題について簡単に理解する方法です。オリジナルとは言いませんが、自分で作ったものです。実際にはこれをCで行う必要があり、mallocを1回だけにしたかったのです。

public static int[] getPrimeFactors(final int i) {
    return getPrimeFactors1(i, 0, 2);
}

private static int[] getPrimeFactors1(int number, final int numberOfFactorsFound, final int startAt) {

    if (number <= 1) { return new int[numberOfFactorsFound]; }

    if (isPrime(number)) {
        final int[] toReturn = new int[numberOfFactorsFound + 1];
        toReturn[numberOfFactorsFound] = number;
        return toReturn;
    }

    final int[] toReturn;

    int currentFactor = startAt;
    final int currentIndex = numberOfFactorsFound;
    int numberOfRepeatations = 0;

    // we can loop unbounded by the currentFactor, because
    // All non prime numbers can be represented as product of primes!
    while (!(isPrime(currentFactor) && number % currentFactor == 0)) {
        currentFactor += currentFactor == 2 ? 1 : 2;
    }

    while (number % currentFactor == 0) {
        number /= currentFactor;
        numberOfRepeatations++;
    }

    toReturn = getPrimeFactors1(number, currentIndex + numberOfRepeatations, currentFactor + (currentFactor == 2 ? 1 : 2));

    while (numberOfRepeatations > 0) {
        toReturn[currentIndex + --numberOfRepeatations] = currentFactor;
    }
    return toReturn;
}
于 2012-09-10T04:09:22.960 に答える
0

数が持つと思われる数の係数を割り当て (32 が適切な候補のように聞こえます)、Arrays.copyOf()実際の制限で配列を切り捨てるために使用します。

return Arrays.copyOf(prime_factors, j);
于 2012-06-25T13:57:23.087 に答える