我被要求解决这个问题:
编写一个函数,它将两个数字
n1
和n2
作为输入(带有n2>n1
)并返回一个对应的最大素数因子数组n1
和n2
之间的每个数字。
我的尝试如下所示,但我的代码无法正常工作。它不是从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;
}
}
}
答案 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筛选的变体将比计算所有这些因素快得多。