代码之家  ›  专栏  ›  技术社区  ›  kesarling

代码中有条件地划分N的问题

  •  0
  • kesarling  · 技术社区  · 5 年前

    所以,我正在努力解决 following 问题陈述

    对于整数N,求出可以执行以下操作的次数:

    Select an integer z which satisfies the 3 conditions:
    
    1. Z can be expressed as p^e where p is prime and e > 0
    2. z is a factor of N
    3. z is different from all previous zs
    
    Now replace N with N / z
    

    这是我尝试的代码:

    #include <algorithm>
    #include <iostream>
    #include <numeric>
    #include <vector>
    
    const bool isPrime(long long num) {
        for (long long div = 2; div <= sqrt(num); div++) {
            if (num % div == 0) {
                return false;
            }
        }
        return true;
    }
    
    std::vector<long long> getFactors(const long long number) {
        std::vector<long long> vec_of_divisors;
        for (long long i = 1; i <= number / 2; i++) {
            if (number % i == 0) {
                vec_of_divisors.push_back(i);
            }
        }
        vec_of_divisors.push_back(number);
        return vec_of_divisors;
    }
    
    bool hasPrimeFactors(long long num) {
        std::vector<long long> divisors = getFactors(num);
        std::vector<long long> prime_vec;
        for (const auto& divisor : divisors) {
            if (isPrime(divisor)) {
                return true;
            }
        }
        return false;
    }
    
    int main() {
        long long N = 997764507000;
        //std::cin >> N;
        long count = 0;
        std::vector<long long> usedFactors;
    
        auto notUsed = [&](long long num) {
            for (auto& elem : usedFactors) {
                if (elem == num) {
                    return false;
                }
            }
            return true;
        };
        long long temp;
        do {
            temp = N;
            std::vector<long long> factors = getFactors(N);
            for (auto& factor : factors) {
                if ((factor != 1) && hasPrimeFactors(factor) && notUsed(factor)) {
                    usedFactors.push_back(factor);
                    N = N / factor;
                    count++;
                    break;
                }
            }
        } while (temp != N);
        std::cout << count << std::endl;
        return 0;
    }
    

    它超过了时间限制 2secs

    看起来代码真的很低效。 我错过了什么?

    我试过调试,但调试完成后需要很长时间 10^11

    0 回复  |  直到 5 年前
        1
  •  1
  •   cigien Jorge Eldis    5 年前

    号码 N 可以考虑在内 (p1 ^ e1)(p2 ^ e2) ... 对于这些因素中的每一个 p^e ,你能分割的最多 N by is (p)(p ^ 2)(p ^ 3)... 当然,所有这些权力的总和需要小于或等于 e .

    所以你只需要计算所有因素一次,然后对每个因素 e ,找到小于或等于的最大三角数 e 重复的因子计算是浪费的工作,是不必要的。