首页 > 其他分享 >用质因数求解最大公约数(gcd)和最小公倍数(lcm)

用质因数求解最大公约数(gcd)和最小公倍数(lcm)

时间:2024-07-02 08:59:44浏览次数:11  
标签:std prime 质因数 gcd factors 公倍数 int factor lcm

用质因数求解最大公约数(gcd)

思路分析:

1、质因数:(素因数或质因子)他指的是能整除给定正整数的质数。例如:36可以分解为223*3,其中2和3就是质因数。
2、质因数求解最大公约数:
对每个数进行质因数分解;
找出所有数的共有质因数,并取每个共有质因数的最低次幂;
将这些最低次幂的质因数想乘,得到的结果就是这些数的最大公约数。
gcd(a,b)=pi的min(ai,bi)次方 * pj的min(aj,bj)次方

code:

#include <iostream>
#include <unordered_map>
#include <cmath>

// 辅助函数:检查一个数是否是质数
bool is_prime(int n) {
    if (n <= 1) return false;
    if (n <= 3) return true;
    if (n % 2 == 0 || n % 3 == 0) return false;
    for (int i = 5; i * i <= n; i += 6) {
        if (n % i == 0 || n % (i + 2) == 0)
            return false;
    }
    return true;
}

// 辅助函数:找到并返回一个数的所有质因数及其次数
std::unordered_map<int, int> find_prime_factors(int n) {
    std::unordered_map<int, int> factors;
    for (int i = 2; i <= std::sqrt(n); ++i) {
        while (n % i == 0) {
            factors[i]++;
            n /= i;
        }
    }
    // 如果n仍然大于1,那么它本身就是一个质数
    if (n > 1) {
        factors[n] = 1;
    }
    return factors;
}

// 使用质因数分解来求解最大公约数
int gcd_by_prime_factors(int a, int b) {
    std::unordered_map<int, int> factors_a = find_prime_factors(a);
    std::unordered_map<int, int> factors_b = find_prime_factors(b);

    int gcd = 1;
    for (const auto& factor_a : factors_a) {
        int prime = factor_a.first;
        int count_a = factor_a.second;

        // 查找b的质因数中是否有prime,并取其最小次数
        auto iter_b = factors_b.find(prime);
        if (iter_b != factors_b.end()) {
            int count_b = iter_b->second;
            int min_count = std::min(count_a, count_b);
            gcd *= std::pow(prime, min_count);
        }
    }

    // 还需要考虑b中独有的质因数(如果a中没有的话)
    for (const auto& factor_b : factors_b) {
        if (factors_a.find(factor_b.first) == factors_a.end()) {
            int prime = factor_b.first;
            int count_b = factor_b.second;
            // 但由于我们只关心共有的质因数,所以这里不增加gcd
        }
    }

    return gcd;
}

int main() {
    int a = 24;
    int b = 36;
    std::cout << "GCD of " << a << " and " << b << " is: " << gcd_by_prime_factors(a, b) << std::endl;
    return 0;
}

用质因数求解最小公倍数(lcm)

思路分析:

1、质因数:(素因数或质因子)他指的是能整除给定正整数的质数。例如:36可以分解为223*3,其中2和3就是质因数。
2、质因数求解最小公倍数:
对每个数进行质因数分解;
找出所有数的共有质因数,并取每个共有质因数的最高次幂;
将这些最高次幂的质因数想乘,得到的结果就是这些数的最小公倍数。
lcm(a,b)=pi的max(ai,bi)次方 * pj的max(aj,bj)次方

code:

#include <iostream>
#include <unordered_map>
#include <cmath>

// 辅助函数:找到并返回一个数的所有质因数及其次数
std::unordered_map<int, int> find_prime_factors(int n) {
    std::unordered_map<int, int> factors;
    for (int i = 2; i <= std::sqrt(n); ++i) {
        while (n % i == 0) {
            factors[i]++;
            n /= i;
        }
    }
    // 如果n仍然大于1,那么它本身就是一个质数
    if (n > 1) {
        factors[n] = 1;
    }
    return factors;
}

// 使用质因数分解来求解最小公倍数
int lcm_by_prime_factors(int a, int b) {
    std::unordered_map<int, int> factors_a = find_prime_factors(a);
    std::unordered_map<int, int> factors_b = find_prime_factors(b);

    // 合并两个数的质因数,取最大次数
    for (const auto& factor_b : factors_b) {
        factors_a[factor_b.first] = std::max(factors_a[factor_b.first], factor_b.second);
    }

    // 计算最小公倍数
    int lcm = 1;
    for (const auto& factor : factors_a) {
        lcm *= std::pow(factor.first, factor.second);
    }

    return lcm;
}

int main() {
    int a = 24;
    int b = 36;
    std::cout << "LCM of " << a << " and " << b << " is: " << lcm_by_prime_factors(a, b) << std::endl;
    return 0;
}

标签:std,prime,质因数,gcd,factors,公倍数,int,factor,lcm
From: https://blog.csdn.net/2301_80662593/article/details/139578107

相关文章

  • 3170 找出最小公倍数
    解法一:循环找#include<bits/stdc++.h>#definef(i,s,e)for(inti=s;i<=e;i++)#definelllonglongusingnamespacestd;constintN=1e3+10,inf=0x3f3f3f3f;intmain(){intn,m;cin>>n>>m;for(inti=n;i<=n*m;......
  • [题解]CF1712E1 LCM Sum (easy version)
    思路这是一道极好的思维题,主要考察了:组合数学和正难则反的方法。这题可以发现如果用直接法将十分的繁琐,于是乎,我们可以用正难则反的方法,即:总的减去不满足的。这道题总的很好求,为:\(C_{r-l+1}^{3}\)。不满足的情况,我们就可以将题目转化为:\(\operatorname{lcm}(i,j,k)<i+......
  • P1072 [NOIP2009 提高组] Hankson 的趣味题【GCD】
    [NOIP2009提高组]Hankson的趣味题题目描述Hanks博士是BT(Bio-Tech,生物技术)领域的知名专家,他的儿子名叫Hankson。现在,刚刚放学回家的Hankson正在思考一个有趣的问题。今天在课堂上,老师讲解了如何求两个正整数......
  • 使用 GCD 实现属性的多读单写
    使用GrandCentralDispatch(GCD)实现多读单写的属性首先需要确保在多线程环境下的线程安全性。可以使用GCD提供的读写锁机制dispatch_rwlock_t或者dispatch_queue_t来实现这个功能。Swift版本的实现怎样创建一个并发队列?//使用Swift来实现的首个好处就是:......
  • 2023 Jiangsu Collegiate Programming Contest, National Invitational of CCPC (Huna
    题目思路来源乱搞ac题解枚举gcd,gcd一定是x的因子,由于lcm+gcd=x,有lcm/gcd+1=x/gcd,还有lcm/gcd>=1枚举lcm/gcd=y,显然如果gcd>1,让gcd和lcm同除以gcd即可,所以可以认为gcd=1,问题转化为,大小为k的集合,k个不同的数,满足gcd=1,且lcm=y的方案数,然后写了个大暴力容斥,没想到过了…......
  • NumPy 差分、最小公倍数、最大公约数、三角函数详解
    NumPy差分离散差分意味着相邻元素之间的减法。例如,对于[1,2,3,4],离散差分将是[2-1,3-2,4-3]=[1,1,1]要找到离散差分,使用diff()函数。示例:importnumpyasnparr=np.array([10,15,25,5])newarr=np.diff(arr)print(newarr)返回:[510-20],因为15-......
  • Diffusers代码学习:LCM 图生图
    要将LCM用于图像到图像,需要将支持的LCM模型的Checkpoint加载到[UNet2DConditionModel]中,并用[LCMscheduler]替换scheduler程序。然后,可以像往常一样使用管道,并传递文本提示和初始图像,只需4个步骤即可生成图像。# 以下代码为程序运行进行设置importosos.environ["HF_ENDP......
  • SQLCMD 密码中的 K8S 秘密用法始终为空
    我试图使用K8Ssecret密码连接到SQL服务器,但无论我使用什么语法或方法,密码总是空的。如果我硬编码密码,则一切正常。我还可以使用此命令在POD中打印密码,它还会返回存储在密码中的密码,因此POD可以实际访问密码。kubectlexec-itpodname--printenvMSS......
  • 两个 GCD 经典问题
    相当Trivial的一篇东西。[ABC177E]Coprime给定\(n\)个数\(a_{1\simn}\),值域为\(V\)。求:是否全部互质是否两两互质问题1:是否全部互质即求\(\gcd\limits_{i=1}^na_i\)是否为\(1\)。直接\(1\simn\)辗转相除求\(\gcd\)。时间复杂度\(O(n+\logV)\)。(......
  • 如何用潜类别混合效应模型(Latent Class Mixed Model ,LCMM)分析老年痴呆年龄数据|附
    全文下载链接:http://tecdat.cn/?p=24647最近我们被客户要求撰写关于LCMM的研究报告,包括一些图形和统计输出。线性混合模型假设N个受试者的群体是同质的,并且在群体水平上由独特的曲线Xi(t)β描述。背景和定义相比之下,潜在类别混合模型在于假设人口是异质的,并且由G潜在类......