C++中如何求一个数的质因数分解

来源:图像处理网作者:弥生美月头衔:网络博主
导读:本期聚焦于小伙伴创作的《C++中如何求一个数的质因数分解》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++中如何求一个数的质因数分解》有用,将其分享出去将是对创作者最好的鼓励。

质因数分解指的是将一个大于1的整数分解为若干个素数相乘的形式,每个素数都是原数的质因数。在C++中实现质因数分解,核心思路是先找到能整除目标数的最小素数,记录该素数后,将目标数除以这个素数,重复这个过程直到目标数变为1。

C++中如何求一个数的质因数分解

基础版质因数分解实现

最基础的思路是从2开始遍历到目标数的平方根,依次判断当前数是否为目标数的因数,如果是则不断除尽该因数,记录结果。这种方法逻辑简单,适合处理数值较小的场景。

#include <iostream>
#include <vector>
using namespace std;

// 基础版质因数分解函数,返回存储质因数的vector
vector<int> primeFactorizationBasic(int n) {
    vector<int> factors;
    // 处理小于2的输入,小于2的数没有质因数
    if (n < 2) {
        return factors;
    }
    // 从2开始遍历到n的平方根
    for (int i = 2; i * i <= n; i++) {
        // 如果i能整除n,说明i是n的质因数
        while (n % i == 0) {
            factors.push_back(i);
            n /= i;
        }
    }
    // 如果最后n大于1,说明剩下的n是质因数
    if (n > 1) {
        factors.push_back(n);
    }
    return factors;
}

int main() {
    int num = 84;
    vector<int> res = primeFactorizationBasic(num);
    cout << num << "的质因数分解为:";
    for (size_t i = 0; i < res.size(); i++) {
        cout << res[i];
        if (i != res.size() - 1) {
            cout << " * ";
        }
    }
    cout << endl;
    return 0;
}

上述代码中,遍历到i*i <= n是因为如果n有大于平方根的质因数,那么必然对应一个小于平方根的质因数,已经被提前处理过了。最后如果n还大于1,说明剩下的n本身就是一个大于平方根的质因数。

优化版质因数分解实现

基础版的问题在于会遍历很多非素数,比如4、6、8等,这些数不可能是质因数,遍历它们会浪费时间。优化思路是先预处理出一定范围内的素数,再用素数去试除目标数,减少不必要的遍历。

#include <iostream>
#include <vector>
using namespace std;

// 埃氏筛法生成素数表
vector<int> generatePrimes(int maxNum) {
    vector<bool> isPrime(maxNum + 1, true);
    vector<int> primes;
    isPrime[0] = isPrime[1] = false;
    for (int i = 2; i <= maxNum; i++) {
        if (isPrime[i]) {
            primes.push_back(i);
            // 标记i的倍数为非素数
            for (int j = i * i; j <= maxNum; j += i) {
                isPrime[j] = false;
            }
        }
    }
    return primes;
}

// 优化版质因数分解函数
vector<int> primeFactorizationOptimized(int n) {
    vector<int> factors;
    if (n < 2) {
        return factors;
    }
    // 生成n平方根范围内的素数表
    int maxPrime = 0;
    for (int i = 2; i * i <= n; i++) {
        maxPrime = i;
    }
    vector<int> primes = generatePrimes(maxPrime);
    // 用素数表中的素数试除
    for (int prime : primes) {
        while (n % prime == 0) {
            factors.push_back(prime);
            n /= prime;
        }
    }
    if (n > 1) {
        factors.push_back(n);
    }
    return factors;
}

int main() {
    int num = 120;
    vector<int> res = primeFactorizationOptimized(num);
    cout << num << "的质因数分解为:";
    for (size_t i = 0; i < res.size(); i++) {
        cout << res[i];
        if (i != res.size() - 1) {
            cout << " * ";
        }
    }
    cout << endl;
    return 0;
}

优化版通过埃氏筛法先得到素数表,只用素数去试除目标数,避免了遍历合数的开销,在处理较大数值的质因数分解时效率更高。如果目标数非常大,还可以结合米勒-拉宾素性检测等算法进一步优化素数判断的逻辑。

两种方案的对比

我们可以通过下表直观对比两种实现的特点:

方案类型时间复杂度空间复杂度适用场景
基础版O(sqrt(n))O(1)数值较小、对空间要求高的场景
优化版O(sqrt(n)/log(sqrt(n)))O(sqrt(n))数值较大、对时间要求高的场景

实际开发中可以根据目标数的大小和运行环境的要求选择合适的实现方案,两种方案的核心逻辑都是不断找到能整除当前数的最小质因数,直到目标数被完全分解。

C++质因数分解算法素数修改时间:2026-07-23 13:06:27

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。