Return string of simple factors in Java

I know this is a classic problem. I solved it in Java. I have my solution below. However, when I used this solution at codefights.com, it went beyond the deadline. I would appreciate it if anyone could give me suggestions for improving this code in any way. Please feel free to criticize my code so that I can improve my coding skills. thanks

You are assigned the number n.

Returns n as the product of its prime factors.

Example

For n = 22, the output should be "2 * 11".

With n = 120, the output should be "2 * 2 * 2 * 3 * 5".

For n = 17194016, the output should be "2 * 2 * 2 * 2 * 2 * 7 * 59 * 1301".

[input] integer n

An integer less than 109. [output] string

Key factors n separated by *. The main factors should be in ascending order.

Solution (JAVA):

public String primefactors(int n) {
    String factors = "";

    for (int i = 2; i <= n / 2; i++) {
        if (isPrime(i)) {
            while (n % i == 0) {
                n /= i;
                if (isPrime(n) && n != 1) {
                    factors = factors + Integer.valueOf(i).toString() + "*"
                            + Integer.valueOf(n).toString();
                    break;
                } else if (n == 1)
                    factors = factors + Integer.valueOf(i).toString();
                else
                    factors = factors + Integer.valueOf(i).toString() + "*";
            }
        }
    }
    return factors;
}

public boolean isPrime(int n) {
    boolean prime = true;
    if (n == 1)
        return false;
    else if (n % 2 == 0 && n!=2)
        return false;
    else if (n % 3 == 0 && n!=3)
        return false;
    else {
        for (int j = 2; j < n / 2; j++) {
            if (n % j == 0) {
                return false;
            }
        }
    }
    return prime;
}
+4
source share
2 answers

Since it is nless than a fixed number (109), just use a table containing all prims <= 109, instead of generating them dynamically. Or at least generate lotions first using an Erastosten or Atkin sieve. An adjusted table is preferable, but using a sieve to generate a table dynamically will also speed up the process. The feature isPrime()you implemented is a performance killer.

+2
source

isPrime() primefactors. , i == 2 2 n. (isPrime(i)) . while (n % i == 0) isPrime(n) n /= 2;. , n 100, isPrime() 50 25. . , , isPrime , .

i : n 1 , n, , , i , sqrt(n).

public String primefactors(int n) {
    String factors = "";
    int max_divisor = sqrt(n);
    for (int i = 2; i <= max_divisor; i++) {
        if (isPrime(i)) {
            while (n % i == 0) {
                n /= i;
                if (n == 1)
                    factors = factors + Integer.valueOf(i).toString();
                else
                    factors = factors + Integer.valueOf(i).toString() + "*";
            }
            max_divisor = sqrt(n);
        }
    }
    // check for the last prime divisor
    if (n != 1)
        factors = factors + Integer.valueOf(n).toString();

    return factors;
}

( sqrt(n) isPrime()) O(n), i sqrt(n) isPrime sqrt(n).


, , isPrime(). , ​​ ( ). , , , sqrt(n). i , sqrt(n), , , isPrime() true.

, isPrime 113. : 2,3,5,7,11,13.... , 113 sqrt(113) (while (i <= 10)). 2,3,5,7 11 , 113 , true.


. , n O(n) . sqrt(n), O(sqrt(n)). , , sqrt(n) . , O(sqrt(n)). , 1024, 2, 10. , , 2.


isPrime()?

, , . . , n sqrt(n), . , - n % i == 0, , , , , n, isPrime(). O(sqrt(n)) :

public String primefactors(int n) {
    String factors = "";
    int max_divisor = sqrt(n);
    for (int i = 2; i <= max_divisor; i++) {
        while (n % i == 0) {
            n /= i;
            max_divisor = sqrt(n);
            if (n == 1)
                factors = factors + Integer.valueOf(i).toString();
            else
                factors = factors + Integer.valueOf(i).toString() + "*";
        }
    }
    // check for the last prime divisor
    if (n != 1)
        factors = factors + Integer.valueOf(n).toString();

    return factors;
}

, if (n == 1) , .

+1

Source: https://habr.com/ru/post/1610025/


All Articles