You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

素因数分解实现唯一幂集合时的重复元素判定问题求助

素因数分解实现唯一幂集合时的重复元素判定问题求助

大家好,我是个编程新手,最近卡在了一个问题上:我想用素因数分解的方式生成唯一的幂集合,但发现数值完全相同的幂会被集合判定为不同元素。

举个例子,24**和**42的数值是相等的,但我的素因数分解结果分别输出成2^2 2^2和2^4,这样存入set<vector<pair<int, int>>>时就被当成了两个不同的元素,导致最终统计的唯一幂数量出错。

我最初的实现代码如下:

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

vector<pair<int, int>> prime_factorization(int n) {
    vector<pair<int, int>> factors;
    while (n % 2 == 0) {
        n /= 2;
        factors.emplace_back(2, 1);
    }
    for (int i = 3; i * i <= n; i += 2) {
        while (n % i == 0) {
            n /= i;
            factors.emplace_back(i, 1);
        }
    }
    if (n > 2) {
        factors.emplace_back(n, 1);
    }
    return factors;
}

set<vector<pair<int, int>>> unique_powers(int a, int b) {
    set<vector<pair<int, int>>> unique;
    for (int i = 2; i <= a; i++) {
        for (int j = 2; j <= b; j++) {
            vector<pair<int, int>> factors = prime_factorization(i);
            for (pair<int, int>& factor : factors) {
                factor.second *= j;
            }
            unique.insert(factors);
        }
    }
    return unique;
}

int main()
{
    set<vector<pair<int, int>>> s = unique_powers(5, 5);
    for (auto v : s) {
        for (auto p : v) {
            cout << p.first << "^" << p.second << "\t| ";
        }
        cout << endl;
    }
    cout << "Unique powers count: " << s.size();
}

运行这段代码后,当输入a=5、b=5时,输出的唯一幂数量是16,但正确结果应该是15——因为2^4和4^2是同一个数值,不该被重复统计。

我尝试过调整幂的压缩逻辑,但一直没成功。后来终于找到问题所在:最初的素因数分解函数把同一个素数的多次幂拆成了多个独立的<素数,1>对,而不是合并成<素数,总幂次>的形式。

修正后的代码如下,现在可以正确生成唯一的幂集合了:

#include <iostream>
#include <vector>
#include <set>

vector<pair<int, int>> prime_factorization(int n) {
    vector<pair<int, int>> factors;
    if (n % 2 == 0) {
        n /= 2;
        factors.emplace_back(2, 1);
        while (n % 2 == 0) {
            n /= 2;
            factors.back().second += 1;
        }
    }
    for (int i = 3; i * i <= n; i += 2) {
        if (n % i == 0)
        {
            n /= i;
            factors.emplace_back(i, 1);
            while (n % i == 0) {
                n /= i;
                factors.back().second += 1;
            }
        }
    }
    if (n > 2) {
        factors.emplace_back(n, 1);
    }
    return factors;
}

set<vector<pair<int, int>>> unique_powers(int a, int b) {
    set<vector<pair<int, int>>> unique;
    for (int i = 2; i <= a; i++) {
        for (int j = 2; j <= b; j++) {
            vector<pair<int, int>> factors = prime_factorization(i);
            for (pair<int, int>& factor : factors) {
                factor.second *= j;
            }
            unique.insert(factors);
        }
    }
    return unique;
}

int main(int argc, char* argv[]) {
    set<vector<pair<int, int>>> s1 = unique_powers(5, 5);
    cout << "Unique powers: " << s1.size() << endl;
    set<vector<pair<int, int>>> s2 = unique_powers(100, 100);
    cout << "Unique powers: " << s2.size() << endl;
    set<vector<pair<int, int>>> s3 = unique_powers(1000, 1000);
    cout << "Unique powers: " << s3.size() << endl;
}

现在运行修正后的代码,输入a=5、b=5时会得到正确的15个唯一幂,数值相同的幂会被素因数分解成完全一致的形式,从而被集合正确判定为同一个元素。

备注:内容来源于stack exchange,提问作者SuboptimalCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 06:40:27