减少数学因子分解期间的迭代次数

时间:2013-08-28 17:01:27

标签: java math

我需要帮助重构内循环。我想要一种更有效的方法,包括更少的迭代。

public static void main(String[] args) {
    for (int i = 2; i <= 100; i++) {
        System.out.print("Factors of " + i + ": ");


        for (int j = 2; j < i; j++)
            if ((i % j) == 0)
                System.out.print(j + " ");
        System.out.println();

    }
}

这是我到目前为止所尝试的内容:

 int j = 2;
        do{
        if ((i % j) == 0) System.out.print(j + " ");
        System.out.println();
        j++;
    } while (j < 2);

这只打印出第一个因素,我不能为我的生活找出如何通过整个列表。我知道我在语义上遗漏了一些东西,但这让我把头发拉了出来。

3 个答案:

答案 0 :(得分:3)

您只需要从j2运行Math.sqrt(i) for循环,因为如果您找到j i因子{}}大于或等于Math.sqrt(i),您还找到了大于或等于i/j的相应因子Math.sqrt(i),您也可以打印该因子(除非j == i/j,那么两次不要打印相同的因子。)

答案 1 :(得分:1)

您无需迭代i。只需sqrt(i)

public static void main(String[] args) {
    for(int i= 2 ; i <= 100 ; i++ ) {
        System.out.print("Factors of " + i + ": ");
        int limit= (int)Math.sqrt(i) ;
        for(int j= 2 ; j <= limit ; j++ )
            if( i % j == 0 ) {
                System.out.print( j + " " );
                System.out.print( (i/j) + " " );
            }
        System.out.println();
    }
}
顺便说一下,你需要所有的除数吗?素因子中的分解要快得多。结果也更简洁,易于理解和使用。

答案 2 :(得分:1)

有许多可能的优化。这里只是几个:

  • 您可以在平方根处停止试用除法,因为如果j是一个因素,那么i/j
  • 您可以确定素数因子并将它们与数字因子结合起来
  • 寻找素数因素,足以按素数进行试验划分
  • 如果数量很大,则存在比试验分割更快的其他分解方法