简体   繁体   中英

How to make the for inner loop more efficient?

I am new to Java and there's this one question that makes me wonder. How to make the for inner loop more efficient in this code?

    for (int i = 2; i <= 100; i++) {
        System.out.print("Factors of " + i + " is: ");
        for (int j = 2; j < i; j++) {
            if (i % j == 0)  System.out.print(j + " ");
        }
        System.out.println();
    }

I was just trying to get the factors of numbers from 2 to 100 but how can i make the inner loop more efficient?

It's a little bit number theory involved here but if you do this it would be efficient specially when the 100 is replaced with something much bigger:

for (int i = 2; i <= 100; i++) {
    System.out.print("Factors of " + i + " is: ");
    for (int j = 2; j <= (int) Math.sqrt(i); j++) {
        if (i % j == 0)  System.out.print(j + " " + i / j + " ");
    }
    System.out.println();
}

You could use the fact that for every divisor a of i there is a number b such that a * b = i .

Find all divisors a <= sqrt(i) and save b = i/a and print these values later.

final int num = 100;
int[] divisors = new int[(int) Math.sqrt(num)];
for (int i = 2; i <= num; i++) {
    System.out.print("Factors of " + i + " is: ");
    int j = 2;
    int index = 0;
    for (; j * j < i; j++) {
        if (i % j == 0) {
            System.out.print(j + " ");
            divisors[index++] = i / j;
        }
    }
    if (j * j == i) {
        // print sqrt(i) only once, if it's integral
        System.out.print(j + " ");
    }
    while (--index >= 0) {
        System.out.print(divisors[index] + " ");
    }
    System.out.println();
}

This way your inner loop needs only O(sqrt(i)) instead of O(i) operations.

This code time complexity is O(N2) .

 public static void main(String[] args) {

        for (int i = 2; i <= 100; i++) {
        System.out.print("Factors of " + i + " is: ");
        for (int j = i/2; j > 1; j--) {
            if (i % j == 0)  System.out.print(j + " ");
        }
        System.out.println();
    }

  }

Try this,as your code output will be displayed as follows (ascending order)

Factors of 24 is: 2 3 4 6 8 12 

please be noticed, but this given code will be displayed output as follows (descending order )

Factors of 24 is: 12 8 6 4 3 2 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM