如何在两个数字之间获得最大的素因子并将它们存储在数组中?

时间:2014-03-24 12:37:56

标签: java arrays prime-factoring

我被要求解决这个问题:

  

编写一个函数,它将两个数字n1n2作为输入(带有   n2>n1)并返回一个对应的最大素数因子数组   n1n2之间的每个数字。

我的尝试如下所示,但我的代码无法正常工作。它不是从n1迭代到n2。我该怎么做对吗?

public static class A{
        static int testcase1=5;
        static int testcase2=10;

        public static void main(String args[]){
            A testInstance = new A();
            int[] result = testInstance.getLpfd(testcase1,testcase2);
            System.out.print("{");
            for (int i=0;i<result.length;i++){
                if (i>0)
                    System.out.print(",");
                System.out.print(result[i]);
            }
            System.out.println("}");
        }

        public int[] getLpfd(int n1,int n2){
            int current=0;
            int[] factors = new int[20];
            for(int j=n1;j<=n2;j++){
                for (int i = 2; i <= j; i++){
                    while(j % i == 0){
                        factors[current]=i;
                        j /= i;
                        current++;
                    }
                }
            }           
            return factors;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

将查找因子的任务与编写最大因子的任务分开是最容易的。这是一个查找因子的函数:

function factors(n)
    f, fs := 2, []
    while f * f <= n
        while n % f == 0
            insert f at head of fs
            n := n / f
        f := f + 1
    if n > 1
        insert n at head of fs
    return fs

以降序返回 n 的因子,因此最大因子位于列表的开头。然后很容易累积一个范围的最大素因子列表:

function lpf(lo, hi)
    result := makeArray(0 .. hi-lo)
    for n from lo to hi
        result[n-lo] := head(factors(n))
    return result

我会留给你把它翻译成Java。

如果您的范围很大,Eratosthenes筛选的变体将比计算所有这些因素快得多。