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

如何用C++实现O(log n)时间复杂度的HCF和LCM求解(含vector)

优化C++实现O(log n)时间复杂度的HCF和LCM求解

你的暴力枚举法通过从两数较小值向下遍历寻找最大公约数,时间复杂度为O(n),无法满足O(log n)的要求。最优解决方案是使用欧几里得算法(辗转相除法),该算法通过不断取余缩小问题规模,时间复杂度为O(log(min(A,B))),完全符合需求。

欧几里得算法核心原理

对于两个正整数A和B,最大公约数满足:
HCF(A, B) = HCF(B, A % B)
重复此过程直到余数为0,此时的除数就是两数的最大公约数。

优化后的完整代码

class Solution 
{
public:
    // 实现欧几里得算法计算HCF
    long long computeHCF(long long A, long long B) {
        while (B != 0) {
            long long temp = B;
            B = A % B;
            A = temp;
        }
        return A;
    }

    vector<long long> lcmAndGcd(long long A , long long B)
    {
        long long hcf = computeHCF(A, B);
        // 先除法再乘法,避免A*B直接相乘导致的long long溢出问题
        long long lcm = (A / hcf) * B;
        vector<long long> v;
        v.push_back(lcm);
        v.push_back(hcf);
        return v;
    }
};

关键改动说明

  • 替换HCF计算逻辑:用欧几里得算法替代暴力枚举,将时间复杂度从O(n)降到O(log n)
  • 避免溢出风险:LCM计算采用(A/hcf)*B而非(A*B)/hcf,因为当A、B为极大值时,直接相乘会超出long long的存储范围,先除以HCF(保证整除)再相乘可规避此问题
  • 保持输出兼容:返回的vector仍按原代码顺序存储LCM和HCF,不影响原有调用逻辑

内容的提问来源于stack exchange,提问作者Anonymous007

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:33:26