Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何优化素数除数函数_Java_Algorithm_Optimization - Fatal编程技术网

Java 如何优化素数除数函数

Java 如何优化素数除数函数,java,algorithm,optimization,Java,Algorithm,Optimization,我有一个求素数因子值的函数。() 例如,它需要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(

我有一个求素数因子值的函数。()

例如,它需要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;
    }
公共列表findPrimeDivisor(int值){
ArrayList除数=新的ArrayList();
int起始点=2;
if(isRound(值,起始点)){
除数。添加(起始点);
}
while(值!=1){
if(isRound(值,起始点)){
值/=起始点;
继续;
}
startPoint++;
除数。添加(起始点);
}
返回因子;
}
私有布尔值isRound(int值,int舍入){
返回值(值%roundBy)==0?真:假;
}

我如何才能更有效地完成它?感谢您的建议:)

您的素数除数计算器不起作用有几个原因,因此直接尝试改进它是不合理的。以下是一些原因:

  • 不计算候选人是否为素数(这是 (至关重要)
  • 从数字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;
}
publicstaticvoidmain(字符串[]args)
{
System.out.println(findPrimeDivisors(25));
System.out.println(find乘数(12));
System.out.println(find乘数(10));
System.out.println(findPrimeDivisors(50));
}
//应该缓存,或者甚至硬编码到某一点
公共静态布尔值iPrime(整数)
{
对于(int i=2;i=2;
}
公共静态列表findPrimeDivisors(int值)
{
List resultList=new ArrayList();
int候选者=2;
while(tryNext(候选者,值))
{
if(isPrime(候选者)&(value%candidate==0))resultList.add(候选者);
候选人++;
}
返回结果列表;
}

Google“java因式分解”用于许多指针(包括本网站上的许多指针)。如果这枚举了其域中所有数字的所有素数(15?),将没有办法更有效地做到这一点:一旦你得到想要的效果,没有其他算法或实现会更有效。效率-每个结果的努力-完全是另一回事;只是别忘了适当地包括用户和程序员的努力。有效地枚举na的素数是最大的作用对我来说,这个数字似乎是数学,然后是算法,然后是编码——每个站点都有一个堆栈交换站点。谢谢你的帮助,我理解了我的错误