如何优化PrimeDivisor功能

时间:2014-10-18 14:36:10

标签: java algorithm optimization

我有找到素数除数的值的函数。 (http://www.calculatorsoup.com/calculators/math/prime-factors.php

例如它需要12并产生2 * 2 * 3 = 2,3如果它需要10它会产生2 * 5 = 2,5就像那样

我的代码如下:

 public List<Integer> findPrimeDivisor(int value) {

        ArrayList<Integer> divisors = new ArrayList<>();

        int startPoint = 2;

        if (isRound(value, startPoint)) {
            divisors.add(startPoint);
        }

        while (value != 1) {
            if (isRound(value, startPoint)) {
                value /= startPoint;
                continue;
            }
            startPoint++;
            divisors.add(startPoint);
        }

        return divisors;
    }

    private boolean isRound(int value, int roundBy) {
        return (value % roundBy) == 0 ? true : false;
    }

我怎样才能更有效地做到这一点?感谢您的建议:)

1 个答案:

答案 0 :(得分:1)

您的素数除数计算器由于多种原因而无法正常工作,因此尝试直接改进它是不合逻辑的。以下是一些原因:

  • 不计算候选人是否是素数(这是 关键)
  • 从数字2开始,如果不分割则添加到结果集 价值(你应该尝试相反)
  • 一旦它最终找到一个可以分割数值的数字,它就不会 将divident添加到结果集中(再次,你应该去 在这里对面)

如果您正在寻找一种方法来找到它们,您可以使用众多可用库中的一个,但如果您想开始制作自己的库,我建议您从小处开始将问题分成几部分:

  • 查找素数的方法(应该缓存其结果)
  • 尝试所有逻辑上可能的候选人的方法
  • 查找所有逻辑上可能的候选人的方法

一个例子可能是:

public static void main(String[] args)
{
    System.out.println(findPrimeDivisors(25));
    System.out.println(findPrimeDivisors(12));
    System.out.println(findPrimeDivisors(10));
    System.out.println(findPrimeDivisors(50));
}

// Should be cached or maybe even hardcoded to a point
public static boolean isPrime(int number)
{
    for(int i = 2; i <= number/2; i++)
        if(number % i == 0)
            return false;

    return true;
}

// Main loopbreaker, decides whether the next candidate should be tried or not, can be more efficient
public static boolean tryNext(int candidate, int value)
{
    return value / candidate >=  2;
}

public static List<Integer> findPrimeDivisors(int value)
{
    List<Integer> resultList = new ArrayList<Integer>();

    int candidate = 2;
    while(tryNext(candidate,value))
    {
        if(isPrime(candidate) && (value % candidate == 0)) resultList.add(candidate);
        candidate++;
    }

    return resultList;
}