0

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

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);

这只会打印出第一个因素,我一生都无法弄清楚如何通过整个列表来获得它。我知道我在语义上遗漏了一些东西,但这让我把头发拔掉了。

4

3 回答 3

3

你只需要从through运行你的jfor 循环,因为如果你发现一个小于或等于的因子,那么你也找到了大于或等于的相应因子,你也可以打印那个因子 (除非,则不要两次打印相同的因子)。2Math.sqrt(i)jiMath.sqrt(i)i/jMath.sqrt(i)j == i/j

于 2013-08-28T17:04:36.577 回答
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();
    }
}

顺便说一句,你需要所有除数吗?素因子的分解要快得多。结果也更加简洁,易于理解和使用。

于 2013-08-28T17:06:12.527 回答
1

有许多优化可能。这里仅仅是少数:

  • 您可以在平方根处停止试除法,因为如果j是一个因素,那么也是i/j
  • 您可以确定主要因素并将它们组合成数字的因素
  • 为了找到素数,按素数进行试除就足够了
  • 如果数量很大,还有其他比试除法更快的分解方法
于 2013-08-28T17:09:27.653 回答