伙计们,我一直在努力找出算法来获取给定数字的所有主要因素的列表(在我的例子中,给定的数字是myNumber = 14
)。例如,
14 = 2 × 7
15 = 3 × 5
645 = 3 × 5 × 43
646 = 2 × 17 × 19
但我的代码无限运行,我不确定我的算法是否正常运行。 smb可以看看还是帮我看看问题怎么样?提前谢谢!
import java.util.*;
public class DistinctFactors {
public static final List<Integer> myList = new ArrayList<>();
public static void main(String[] args){
int result = 1;
int myNumber = 14;
int i = 2;
while(result != myNumber){
if(isPrime(i)){
myList.add(i);
result *= i;
}
i++;
}
for(int j = 0; i < myList.size(); j++){
System.out.print(myList.get(j) + " ");
}
}
private static boolean isPrime(int number){
for(int i = 2; i < number; i++){
if(number % 2 == 0){
return false;
}
}
return true;
}
}
答案 0 :(得分:1)
我的意思是,让我们看看结果和我的价值是什么。
Pass 1: r = 1, i = 2
Pass 2: r = 2, i = 3
Pass 3: r = 6, i = 4
Pass 4: r = 6, i = 5
Pass 5: r = 30, i = 6
从这一点开始,r只会增加,并且它已经大于14.所以当然这个循环永远不会终止。
你的方法也是非常错误的。我不知道你为什么选择这种方式来尝试获得主要因素。
更不用说,即使你的isPrime方法也有点愚蠢。它会一直检查您要检查的号码,这非常浪费。
要检查数字n是否为素数,您应该计算平方根;如果它是一个整数,那么这个数字显然不是素数。否则,取出那个sqrt(n)的地板 - 让我们称之为k - 并将循环运行到k。如果n不是素数,你会发现该范围内的除数;如果你找不到,n就是素数。
(这是一个O(log(n))方法。最好的方法是检查数字是否满足随机值的Fermat's Little Theorem,这是一个恒定的时间。)
编辑:嗯,如果你不考虑某些操作O(1),那么时间不是很准确。对于庞大的数字,它比其他方法好得多您当前的循环只检查该数字是否多次......