当前位置:首页 > GESP > 2023年GESP五级题「因式分解」洛谷B3871算法解析与代码实现

2023年GESP五级题「因式分解」洛谷B3871算法解析与代码实现

6个月前 (06-19)

2023年GESP五级题「因式分解」洛谷B3871算法解析与代码实现 GESP五级 质因数分解  算法优化 第1张

一、题目解读

2023年GESP五级题「因式分解」(洛谷B3871)要求将给定的大整数N分解为质因数的乘积形式,并输出每个质因数及其指数。题目考察核心算法质因数分解,需高效处理大数分解,避免超时。难点在于如何优化分解过程,减少循环次数,同时准确记录每个质因数的出现次数。

二、解题思路

用户提供的代码采用试除法进行质因数分解,核心逻辑分为三步:

1. 优先处理2因子:由于2是唯一的偶质数,单独处理可减少后续循环次数。通过循环除以2,统计其出现次数。

2. 处理奇数因子:从3开始,以步长2遍历奇数(跳过偶数),利用sqrt(n)优化上限,减少遍历范围。

3. 处理剩余大质数:若分解后n仍大于1,说明剩余部分为大于sqrt(n)的质数,直接作为单个因子加入结果。

该思路通过分阶段处理,结合数学优化(如sqrt减少遍历范围),实现高效分解。

三、解题步骤

1. 输入:读取用户输入的整数N。

2. 质因数分解:调用factorize(N)函数,利用试除法分解N,结果存入vector<pair<long long, int>>(质因数+指数)。

3. 输出结果:遍历结果vector,拼接质因数表达式(如2^3 * 3^2)。

4. 边界处理:若N为质数或剩余大质数,单独处理其指数为1的情况。

四、代码与注释

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

// 质因数分解函数
vector<pair<long long, int>> factorize(long long n) {
    vector<pair<long long, int>> factors;
    
    // 处理2的因子
    if (n % 2 == 0) { // 优先处理2,减少后续循环次数
        int cnt = 0;
        while (n % 2 == 0) {
            n /= 2;
            cnt++; // 统计2的个数
        }
        factors.emplace_back(2, cnt); // 添加至结果
    }
    
    // 处理奇数因子
    for (long long i = 3; i <= sqrt(n); i += 2) { // 仅遍历奇数,优化范围
        if (n % i == 0) {
            int cnt = 0;
            while (n % i == 0) {
                n /= i;
                cnt++;
            }
            factors.emplace_back(i, cnt); // 添加质因数及其指数
        }
    }
    
    // 处理剩余的大质数(若n仍未1,说明其为大于sqrt(n)的质数)
    if (n > 1) {
        factors.emplace_back(n, 1);
    }
    
    return factors;
}

int main() {
    long long N;
    cin >> N;
    
    auto factors = factorize(N);
    bool first = true;
    
    // 输出格式:质因数^指数,用*分隔
    for (const auto& [prime, exp] : factors) {
        if (!first) {
            cout << " * ";
        }
        first = false;
        
        cout << prime;
        if (exp > 1) {
            cout << "^" << exp;
        }
    }
    
    cout << endl;
    return 0;
}

五、总结

1. 算法效率:通过优先处理2因子、奇数遍历步长2、sqrt优化上限,该代码在时间复杂度上远优于暴力枚举,适用于大数分解场景。

2. 代码优化点:

    使用vector动态存储因子,避免固定数组长度限制。

    利用C++11的结构化绑定([prime, exp])简化迭代输出。

3. 扩展思考:对于更复杂的大数分解问题,可结合筛法(如埃氏筛)预处理质数表,进一步提升效率。

该题目解法不仅是GESP竞赛的典型考点,也为学习数学与编程结合的算法思维提供了优秀案例。



原创内容 转载请注明出处

分享给朋友:

相关文章

2024年GESP五级武器强化(洛谷B4071)解题代码C++版

2024年GESP五级武器强化(洛谷B4071)解题代码C++版

一、题目解读    2024年GESP(青少年软件编程能力等级考试)五级中的“武器强化”(洛谷平台题目编号B4071)是一道典型的算法优化问题。题目要求通过合理...

力扣2085题解析:统计两个数组中只出现一次的公共单词数目详解

力扣2085题解析:统计两个数组中只出现一次的公共单词数目详解

一、题目解读力扣2085题要求给定两个字符串数组words1和words2,统计两个数组中只出现一次的公共单词的数量。例如,若words1包含["a", "b"...

2024年GESP五级成绩排序算法解析:洛谷B3968代码实现与优化思路

2024年GESP五级成绩排序算法解析:洛谷B3968代码实现与优化思路

一、题目解读题目要求对n名学生的语文、数学、英语成绩进行排序,并输出按原始输入顺序的排名。排序规则需依次比较总分、语数总分、语数最高分,若完全相同时保持原始顺序。需处理并列排名,确保相同成绩的学生获得...

洛谷P1593题解:质因数分解与快速幂优化求解

洛谷P1593题解:质因数分解与快速幂优化求解

一、题目解读洛谷P1593题是一道涉及数学推导与算法优化的题目,要求计算给定整数a的b次方各质因数的乘积,并对结果取模9901。题目核心在于将指数运算转化为质因数分解,结合等比数列求和公式求解,需兼顾...

GESP五级算法题解:小杨的幸运数字(洛谷B3929)代码分析与优化

GESP五级算法题解:小杨的幸运数字(洛谷B3929)代码分析与优化

一、题目解读洛谷题目B3929“小杨的幸运数字”要求处理一系列查询数字x,将其转化为≥x的最小幸运数字。幸运数字定义为:≥a的完全平方数的倍数。题目难点在于高效判断和生成幸运数,避免超时。二、解题思路...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。