ProjectEuler给定数字的不同主要因素

时间:2015-07-23 00:29:52

标签: java

伙计们,我一直在努力找出算法来获取给定数字的所有主要因素的列表(在我的例子中,给定的数字是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;
    }
}

1 个答案:

答案 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),那么时间不是很准确。对于庞大的数字,它比其他方法好得多

您当前的循环只检查该数字是否多次......