LeetCode—1390

Approach

# Prime
先建質數表、分解後看是不是4個因數
如果是用兩個質數判斷,注意1 2 4 8 = 8這一種的例外

Time Complexity

O(N ∗ Sqrt(M))

Space Complexity

O(N * Sqrt(M))

Code

class Solution {
public:
    void make_prime_table(vector<int>& prime, int num) {
        prime.push_back(2);
        prime.push_back(3);

        for (int i = 5 ; i <= sqrt(num) ; i+=2) {
            bool ok = true;

            for (int j = 0 ; j < prime.size() && prime[j] <= sqrt(i) ; j++) {
                if (i % prime[j] == 0) {
                    ok = false;
                }
            }

            if (ok) {
                prime.push_back(i);
            }
        }
    }

    int sumFourDivisors(vector<int>& nums) {
        vector<int> prime;
        make_prime_table(prime, 100000);

        /*
        for (int i = 0 ; i < prime.size() ; i++) {
            cout << prime[i] << endl;
        }
        21 = 1 3 7 21
        8  = 1 2 4 8
        */

        int ans = 0;
        for (int i = 0 ; i < nums.size() ; i++) {
            int div1 = 0, div2 = 0, cnt = 0;

            for (int j = 0 ; j < prime.size() && prime[j] <= sqrt(nums[i]) ; j++) {
                if (nums[i] % prime[j] == 0) {
                    div1 = prime[j];
                    div2 = nums[i] / prime[j];
                    cnt++;
                }
            }

            if (cnt == 1 && (div1 != div2)) {
                bool div2_is_prime = true;

                for (int j = 0 ; j < prime.size() && prime[j] <= sqrt(div2) ; j++) {
                    if (div2 % prime[j] == 0) {
                        if (div2 / prime[j] != prime[j]) {
                            div2_is_prime = false;
                            break;
                        };
                    }
                }

                if (div2_is_prime == true) {
                    //printf("%d %d %d %d\n", 1, div1, div2, nums[i]);
                    ans = ans + (1 + div1 + div2 + nums[i]);
                }
            }
        }

        return ans;
    }
};